9

私はMongoDBにSpringDataを使用しており、次のクラスを取得しています

class A {
    List<B> b;
}

class B {
    Date startDate;
    Date endDate;
}

Aのオブジェクトを保存すると、次のように永続化されます。

{
    "_id" : "DQDVDE000VFP8E39",
    "b" : [
          {
              "startDate" : ISODate("2009-10-05T22:00:00Z"),
              "endDate" : ISODate("2009-10-29T23:00:00Z")
          },
          {
              "startDate" : ISODate("2009-11-01T23:00:00Z"),
              "endDate" : ISODate("2009-12-30T23:00:00Z")
          }
    ]
}

ここで、指定された日付がstartDateとendDateの間にあるbのエントリに一致するドキュメントをデータベースにクエリします。

Query query = new Query(Criteria.where("b").elemMatch(
    Criteria.where("startDate").gte(date)
    .and("endDate").lte(date)
);

これにより、次のmongoクエリが生成されます。

{
   "b": {
       "$elemMatch": { 
           "startDate" : { "$gte" : { "$date" : "2009-11-03T23:00:00.000Z"}}, 
           "endDate" : { "$lte" : { "$date" : "2009-11-03T23:00:00.000Z"}}
       }
   }
}

ただし、結果のドキュメントは返されません。誰かが私が間違っていることを知っていますか?理解できません...

事前にどうもありがとうございました!!

4

2 に答える 2

13

配列要素のとのdate間にあるドキュメントを検索する場合は、とを逆にする必要があります。startDateendDatebgtelte

Query query = new Query(Criteria.where("b").elemMatch(
    Criteria.where("startDate").lte(date)
    .and("endDate").gte(date)
);
于 2012-09-07T04:34:02.480 に答える
1
{"created_at":{$gt:ISODate("2013-04-30T00:00:00Z"),$lt:ISODate("2013-04-30T23:59:59Z")}}
于 2013-05-06T05:02:36.160 に答える