MongoDB Java驱动程序:多日期查询

时间:2013-12-18 03:48:37

标签: java mongodb

我正在尝试使用MongoDB Java Driver创建一个查询作为聚合命令的一部分。目前,我允许将日期范围或特定日期数组作为参数。例如

<date>
    <start>2013-12-10 00:00:00.000</start>
    <end>2013-12-12 23:59:59.999</end>
</date>

or

<date>
    <specificDates>2013-12-10 00:00:00.000,2013-12-13 00:00:00.000</specificDates>
</date>

日期范围查询工作正常,我解析并将xml转换为在mongo中生成以下查询的DBObject;

{ "$match" : { "d" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"} , "$lt" : { "$date" : "2013-10-04T00:00:00.000Z"}}}}

对于特定日期,我只想返回在给定日期的00:00:00000和第二天的00:00:00000之间发生的结果。根据我对mongo querys的基本知识,我曾希望在日期范围内进行类似的$ match匹配,但是在类似于以下的日期范围数组中使用$ in;

{ "$match" : { "d" : { "$in" : [ { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"} , "$lt" : { "$date" : "2013-10-02T00:00:00.000Z"}} , { "$gte" : { "$date" : "2013-10-03T00:00:00.000Z"} , "$lt" : { "$date" : "2013-10-04T00:00:00.000Z"}}]}}}

上述查询无法返回任何结果。我注意到Mongo聚合框架部分下的mongodb手册中没有列出$ in,但它没有抛出任何我期望的不支持操作的错误。

我认为问题可能来自MongoDB手册中的这一行;

  

如果该字段包含一个数组,则$ in运算符选择其字段包含一个数组的文档,该数组至少包含一个与指定数组中的值匹配的元素(例如,等等)

在我的集合中,日期不存储在数组中,我想我可以将它存储在单个元素数组中的集合中? (实际上,我决定在发布之前快速尝试这个,当文档中的日期条目存储在单个元素数组中时没有文档返回)

  

文档输入示例

     

{“_ id”:ObjectId(“52aea5b0065991de1a56d5b0”),“d”:ISODate(“2013-12-15T00:00:11.088Z”),“t”:1501824,“s”:0,“e” :601,“tld”:“uk”,“y”:“domain:check”,“n”:“removed.co.uk”}

是否有人能够就如何进行此查询给我一些建议?谢谢。

编辑:我在这里留下了Java标签,以防任何人需要我的DBObject创建代码,尽管它不是必需的,因为发布的查询是由我的构建生成的。

EDIT2:所以当Alan Spencer指出我应该使用$或者而不是$ in时,一个工作的$或函数在下面(忽略不同的格式,如使用ISODate(),它只是从mongo shell粘贴的副本而不是从我的程序中获得输出)

{ $match : { $or : [ { d : { $gte : ISODate("2013-10-01T00:00:00.000Z"), $lt : ISODate("2013-10-02T00:00:00.000Z") } }, { d : { $gte : ISODate("2013-10-03T00:00:00.000Z"), $lt : ISODate("2013-10-04T00:00:00.000Z") } } ] } }

1 个答案:

答案 0 :(得分:0)

我认为你正在颠倒$ in的含义。

$ in用于精确匹配可能值的列表,例如

{"color":{"$in": ["red","green","blue"]}}

对于您的用例,如果它满足第一个秒等,则尝试匹配。因此,您可以使用$或 - http://docs.mongodb.org/manual/reference/operator/query/or/

{ "$match" : { "d" : { "$or" : [ { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"} , "$lt" : { "$date" : "2013-10-02T00:00:00.000Z"}} , { "$gte" : { "$date" : "2013-10-03T00:00:00.000Z"} , "$lt" : { "$date" : "2013-10-04T00:00:00.000Z"}}]}}}