当前位置: 首页 > 知识库问答 >
问题:

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

孟成化
2023-03-14

我正在尝试使用MongoDBJava驱动程序作为聚合命令的一部分创建查询。目前我允许日期范围或特定日期数组作为参数。例如

<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:00.000和第二天的00:00:00.000之间发生的结果。根据我对mongo查询的基本了解,我希望做一个类似于日期范围的$匹配,但是让它在类似于以下的日期范围数组中使用$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"}}]}}}

上述查询无法返回任何结果。我注意到,mongodb手册中的Mongo聚合框架部分中没有列出$,但它不会引发任何我认为不受支持的操作会出现的错误。

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

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

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

文档输入示例

{“\u 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个答案

朱阳晖
2023-03-14

我认为你在颠倒美元的含义。

$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"}}]}}}
 类似资料:
  • 我的目标是使用聚合框架创建一个管道来对我的数据进行分组,然后将这个管道与java驱动程序一起使用。MongoDB v4.0.3 我使用MongoDB Compass创建了以下管道(减少到重要部分): 这导致以下(生成的)Java代码: 集合中$组阶段之前的数据如下所示: $组阶段应返回以下数据结构: 问题所在 Mongo Compass按预期预览了阶段的结果,但使用java驱动程序的阶段的结果非常

  • UTCDateTime的var_dump显示有效值: 对象(MongoDB\bson\utcdatetime)#477(1){[“毫秒”]=> 字符串(10)“1515954053”} 预期返回的文档示例: UPDATE:删除发送到UTCDateTime对象的变量,如下所示: 作品(如上面所示,我在将来添加了一个记录)。问题是当我发送变量来指定我需要的时间戳时。

  • 您好,我正在尝试从mongodb获取D-7天的文档 示例:如果今天是“星期三”,那么我只想获取上一个“星期三”的文档 我得到的日期从前端, 日期格式在mongob: 日期格式从邮递员:"2020-01-15"我在nodejs转换成dateObject.喜欢这个: 2020-01-15T00:00:00.000Z nodejs查询 邮递员。身体 POSTMAN响应返回空数组 Mongodb系列

  • 我使用python脚本,它传递给卡桑德拉批处理查询,如下所示: 这是一段时间的工作,但在启动脚本失败并打印后约2分钟内: 我将超时从 更改为: read_request_timeout_in_ms:15000 range_request_timeout_in_ms:20000 write_request_timeout_in_ms:20000 cas_contention_timeout_in_m

  • 我需要将ISODate转换为字符串格式,如“2019-06-27”,并且还需要按日期对其进行排序。然而,我已经以所需的格式转换了日期,但由于日期字符串格式较早转换而混淆了日期排序。 应用环境 。NET MongoDB驱动程序-2.0 MongoDB版本-3.2 以下是文档在MongoDB集合中的存储方式: 这是工作的C#函数,但没有日期排序: 但如果我没有日期转换,它的工作原理是这样的 下面是数据

  • 问题内容: 我有一个用例,需要加载单独的角度应用程序。 基于几个堆栈溢出问题和这个google线程,它是可行的。但是,我无法使其正常工作。 查看文档: http://docs.angularjs.org/api/angular.bootstrap 看来您需要提供该元素(在该元素上获得句柄的正确方法是什么?),然后如何将其绑定回config,controller等。这如何与路由一起使用?IE碰撞如何