基于日期范围查找文档在 mongodb shell 中有效,但不适用于 pymongo

Posted

技术标签:

【中文标题】基于日期范围查找文档在 mongodb shell 中有效,但不适用于 pymongo【英文标题】:Finding document based on date range works in the mongodb shell, but not with pymongo 【发布时间】:2014-12-21 23:30:34 【问题描述】:

在 mongo shell 上,它返回一个文档就好了:

> db.orderbook_log.findOne('time':  '$gte': new Date(2014, 9, 24, 17, 38, 20, 546000), '$lt': new Date(2014, 10, 24, 17, 39, 20, 546000))

    //... returns document with this time stamp:
    "time" : ISODate("2014-10-25T00:47:30.819Z")

请注意,我在 10 月使用了“9”,因为 javascript 的月份是 0-11。 而且我还用“23”作为天进行了测试,因为看起来 JS 天也是 0-indexed,并且还返回了一个文档:"time" : ISODate("2014-10-24T17:32:13.595Z")

atime = datetime.datetime(2014, 10, 24, 17, 38, 20, 546000)
btime =  datetime.datetime(2014, 10, 24, 17, 39, 20, 546000)

future_book = log.find_one("time": "$gte": atime, "$lt": btime)

但是当我在 pymongofuture_book 中执行 find_one 时是 None

我真正想做的只是循环前 100 条左右的记录,然后获取相对一分钟后发生的记录。

【问题讨论】:

【参考方案1】:

Javascript 天不是零索引的,唉。只有几个月。

我在您的 Javascript 中看到您将 546,000 毫秒添加到第一个日期,因此结果为 2014 年 10 月 24 日 17:48:26。 Javascript 然后转换为您的本地时区,因此在我的情况下它增加了 5 小时:

> new Date(2014, 10, 24, 17, 39, 20, 546000)
ISODate("2014-11-24T22:48:26Z")

然后将其与文档中的“时间”字段进行比较(忽略时区)。

最好去掉最后的毫秒参数,使用MongoDB shell的ISODate函数,比Javascript Dates设计的更合理:

> ISODate('2014-10-24T17:38:20')
ISODate("2014-10-24T17:38:20Z")

然后它将以您期望的方式与您的文档进行比较,并且它应该匹配 PyMongo 行为。我建议您也从 Python 日期时间构造函数中删除毫秒参数,以澄清事情。

【讨论】:

以上是关于基于日期范围查找文档在 mongodb shell 中有效,但不适用于 pymongo的主要内容,如果未能解决你的问题,请参考以下文章

在spring mongodb中的两个字符串日期范围之间查找

从 Vava 到 MongoDB 查询:查找特定日期范围内的事件

mongodb罗盘汇总$具有动态日期的匹配范围

日期范围查询 mongodb

MongoDB索引管理

在mongodb中查找日期之间的数据?