MongoTemplateの時間データ付き操作

40501 ワード

文書ディレクトリ
  • いくつかのデータを挿入して
  • を見てください.
  • 日付による
  • の問合せ
  • 時間範囲別クエリー
  • クエリーの変更
  • java8 Springboot
    データを挿入してみましょう
    TimeMongoクラスを定義し、エンティティクラスとして異なるタイプの時間を設定します.
    @Id
    String id;
    Date date;
    LocalDateTime localDateTime;
    LocalDate localDate;
    LocalTime localTime;
    String string;
    
    public TimeMongo(String id, Date date,  LocalDate localDate, LocalTime localTime, String string) {
            this.id = id;
            this.date = date;
            this.localDateTime = LocalDateTime.of(localDate,localTime);
            this.localDate = localDate;
            this.localTime = localTime;
            this.string = string;
        }
    

    挿入方法
    public void insert(List<TimeMongo> timeList) {
            mongoTemplate.insert(timeList,"timeList");
    }
    

    任意のインスタンスを挿入
    List<TimeMongo> timeMongos = Arrays.asList(
                    new TimeMongo("1", getDate(2020, 1, 2),LocalDate.of(2020, 1, 2), LocalTime.now(), "2020-01-02"),
                    new TimeMongo("2", getDate(2020, 2, 6), LocalDate.of(2020, 2, 6), LocalTime.now(), "2020-02-06"),
                    new TimeMongo("3", getDate(2020, 2, 15), LocalDate.of(2020, 2, 15), LocalTime.now(), "2020-02-15"),
                    new TimeMongo("4", getDate(2020, 3, 20), LocalDate.of(2020, 3, 20), LocalTime.now(), "2020-03-20"),
                    new TimeMongo("5", getDate(2020, 3, 21), LocalDate.of(2020, 3, 21), LocalTime.now(), "2020-03-21"),
                    new TimeMongo("6", getDate(2020, 4, 2), LocalDate.of(2020, 4, 2), LocalTime.now(), "2020-04-02"),
                    new TimeMongo("7", getDate(2020, 4, 6), LocalDate.of(2020, 4, 6), LocalTime.now(), "2020-04-06")
            );
            mongoTime.insert(timeMongos);
    
    private Date getDate(int year, int month, int day) {
            Calendar ca = Calendar.getInstance();
            ca.set(year, month - 1, day);
            return ca.getTime();
        }
    

    実行後にmongoライブラリを表示すると、様々なタイプの時間がmongoに保存されているのは同じシステムの時間フォーマットであることがわかりました.
    {
    	"_id" : "7",
    	"date" : ISODate("2020-04-06T13:23:37.691+08:00"),
    	"localDateTime" : ISODate("2020-04-06T13:23:37.691+08:00"),
    	"localDate" : ISODate("2020-04-06T00:00:00.000+08:00"),
    	"localTime" : ISODate("2020-03-16T13:23:37.691+08:00"),
    	"string" : "2020-04-06",
    	"_class" : "zs.entity.mongoPo.TimeMongo"
    }
    

    日付によるクエリー
    public List<TimeMongo> select(TimeMongo timeMongo) {
            Query query = new Query(Criteria.byExample(timeMongo));
            return mongoTemplate.find(query, TimeMongo.class, "timeList");
        }
    

    localdateに従って検索
    TimeMongo t=new TimeMongo();
    t.setLocalDate(LocalDate.of(2020, 4, 2));
    mongoTime.select(t).forEach(timeMongo -> System.out.println(timeMongo.toString()));
    

    クエリ結果TimeMongo{id=‘6’,date=Thu Apr 02 13:23:37 CST 2020,localDateTime=2020-04-02 T 13:23:37.691,localDate=2020-04-02,localTime=13:23:37.691,string=‘2020-04-02’}問題なく、私が望む結果です
    Dateクエリーによって結果が検出されませんでしたが、原因については、localDate作成時のデフォルトは0で、Date時間のデフォルトは現在、時間が異なるので、クエリーがどのように時間を無視して日付だけを見て、以下を書きますか.
    時間範囲別クエリー
    ビジネスで最も一般的に使用されるのは、2020-02-05から2020-05-20の間に登録されているユーザーが直男検査を試してみるなど、2つの日付間のデータを取得することです.
    public void select(String startTime, String endTime) {
            Query query1 = new Query(Criteria.where("date").gte(startTime).andOperator(Criteria.where("date").lte(endTime)));
            mongoTemplate.find(query1, TimeMongo.class, "timeList").forEach(e -> System.out.println(e.toString()));
            System.out.println("-------------------------");
    
            Query query2 = new Query(Criteria.where("localDateTime").gte(startTime).andOperator(Criteria.where("localDateTime").lte(endTime)));
            mongoTemplate.find(query2, TimeMongo.class, "timeList").forEach(e -> System.out.println(e.toString()));
            System.out.println("-------------------------");
    
            Query query3 = new Query(Criteria.where("localDate").gte(startTime).andOperator(Criteria.where("localDate").lte(endTime)));
            mongoTemplate.find(query3, TimeMongo.class, "timeList").forEach(e -> System.out.println(e.toString()));
            System.out.println("-------------------------");
    
            Query query4 = new Query(Criteria.where("string").gte(startTime).andOperator(Criteria.where("string").lte(endTime)));
            mongoTemplate.find(query4, TimeMongo.class, "timeList").forEach(e -> System.out.println(e.toString()));
            System.out.println("-------------------------");
        }
    

    2020-03-20形式で結果をクエリーします.最後のstringには結果がありますが、他にはありません.2020-03-20 T 00:00:00:00.000+08:00を押して、結果の差は多くなくて、その他はすべてなくて、ただ単純な文字列の比較
    startTime、endTimeを他のフォーマットに変更してみてください.この下で上の3つの時間タイプを調べることができます.原理はやはり各種の日付タイプを1つに統一して、固定的な文字列フォーマットに変換して、最後に文字列を比較して、比較時は日付と時間を比較して、2つの方法で需要を解決することができます.時間のフィールドを保存する必要がないときは日付だけを保存します.またはクエリーの変更
    クエリーの変更
    mongoクエリ文長この様子
    db.timeList.find({
        "localDate":{
            "$gte" : ISODate("2020-02-06T00:00:00.000+08:00") }, 
            "$and" : [{ "localDate" : { "$lte" : ISODate("2020-03-21T00:00:00.000+08:00") } 
            }]
    })
    

    ISO Dateという鬼がコードの中でどのように表示されているのか、私も知らないが、コードの中の様々な時間タイプが保存されて統一されたシステムの時間タイプになった.しかし、時間を調べるには、元の時間を指定したフォーマット文字列に変えてmongoをフィルタリングすることで、対応するトランスフォーム方式dateToStringを提供しています.
    db.timeList.aggregate([
        {
            "$project": {
                "date": {
                    "$dateToString": {
                        "format": "%Y-%m-%d",
                        "date": "$localDateTime"
                    }
                }
            }
        },
        {
            "$match": {
                "localDateTime": {
                    "$gte": "2020-02-06"
                },
                "$and": [
                    {
                        "localDateTime": {
                            "$lte": "2020-03-21"
                        }
                    }
                ]
            }
        }
    ])
    

    実行文はありますが、コードに対応する方法を探して、一般的に対応します.Projectはsql文selectの後ろの列に似ています.フィールドasフィールド名を選択します.ただ、実行順序が違います.まず別名をつけてから別名に基づいてフィルタリングしなければなりません.sqlはまず後ろの山を実行し、最後にselectを実行します.
    public void select(String startTime,String endTime){
            AggregationOperation project=Aggregation.project().and("localDateTime")
                    .dateAsFormattedString("%Y-%m-%d").as("date");
            AggregationOperation match= Aggregation.match(Criteria.where("date").gte(startTime)
                    .andOperator(Criteria.where("date").lte(endTime)));
            Aggregation aggregation=Aggregation.newAggregation(project,match);
            
            List<Document>documentList=mongoTemplate.aggregate(aggregation,"timeList",Document.class)
                    .getMappedResults();
            documentList.forEach(document -> System.out.println(document.toJson()));
        }
    

    集約とクエリーを使用すると、時間フォーマットの文字列を手動で処理する必要はありません.また、他の集合とより豊富な操作を関連付けることができます.