Spring Data MongoDB日期在两个日期之间

9
我正在使用Spring Data for MongoDB,有以下类:
```java ```
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")
          }
    ]
}

现在我想查询数据库,找到与b中条目相匹配的文档,其中给定日期位于startDate和endDate之间。
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"}}
       }
   }
}

但没有返回任何结果文档。有人知道我做错了什么吗?我不明白...非常感谢您的帮助!

“margins”在那个Mongo查询中是做什么的?这是Java驱动程序特有的东西吗?我在你的数据中没有看到它。 - JohnnyHK
是的,它不对应于Spring Data查询,也是不正确的。你应该查询where("b"),而不是查询where("a")。 - jyemin
对不起,各位,昨天太晚了。我已经修复了两个复制粘贴错误! - sics
你展示的那个文档并不满足查询条件,还有其他文档能够满足吗?你的 $gte$lte 条件是否应该交换。 - JohnnyHK
@sics,您正在使用哪个版本的spring-data-mongodb? - Ghasfarost
2个回答

13
如果您想查找文档,其中date处于b数组元素的startDateendDate之间,则需要颠倒gtelte的调用:
Query query = new Query(Criteria.where("b").elemMatch(
    Criteria.where("startDate").lte(date)
    .and("endDate").gte(date)
);

哦,我的天啊,提醒一下大脑:在工作了12个小时(还在编码)之后再编码是不好的 :) 谢谢你帮我解决这个问题 - 初学者的错误! - sics
旁边的问题 - 如何使用startDateendDate字段进行索引?我的理解是,在索引时,“范围”字段位于复合索引的最后。例如:“查找所有年龄在50到75岁之间的男性”。使用genderage字段,您可以在gender-age上创建一个复合索引。(http://cookbook.mongodb.org/patterns/date_range/) - Kevin Meredith
如果这些日期是字符串形式,我们能做到吗? - Sumanth Varada

1
{"created_at":{$gt:ISODate("2013-04-30T00:00:00Z"),$lt:ISODate("2013-04-30T23:59:59Z")}}

虽然从纯粹的Mongo角度来看这是正确的,但问题是关于spring-data-mongo的API。 - ryber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接