mongodb 罗盘查询,对象Id在日期范围内

Wil*_*ham 10 mongodb mongodb-compass

我正在尝试使用指南针在字段上执行日期范围查询_id。我已经使用以下过滤器尝试了在这里找到的内容:

{_id: { $gte: ObjectId.fromDate(new Date('2019-01-01')) } }
Run Code Online (Sandbox Code Playgroud)

我缺少什么?我想获取从某个日期开始的所有文档的列表(在本例中是从 2019 年 1 月 1 日至今)。不幸的是,文档字段中没有时间戳,因此我需要从对象 ID 中提取它。

zhu*_*ien 14

您需要将日期对象传递给ObjectId.fromDate,而不是字符串。尝试这个:

ObjectId.fromDate(new Date('2019-01-01'))
Run Code Online (Sandbox Code Playgroud)

该函数仅在 shell 中起作用,在驱动程序中不存在。

评论后编辑:

这是一个也适用于 Compass 的解决方案:

{ 
    $expr: { 
        $gte: [
            {"$toDate":"$_id"}, 
            ISODate("2021-01-01T00:00:00.000Z") 
        ]
    } 
}
Run Code Online (Sandbox Code Playgroud)

但请记住,它需要4.0+mongo的版本。您可以在此处查看文档

另外,请查看此相关主题:Can I query MongoDB ObjectId by date?

它与 无关,但它提供了从日期Compass生成 s 而不依赖于 的解决方案。ObjectIdObjectId.fromDate()


Wil*_*ham 5

我找到了一个解决方案,也许不是最好的,但它可以完成工作。如果没有更干净的解决方案,希望这可以帮助遇到相同问题的人。

我将所需的日期转换为在线罗盘之外的 ObjectId 。然后我用该 ObjectId 编写了查询:

{_id: { $gte: ObjectId(' object id here ') } }
Run Code Online (Sandbox Code Playgroud)

根据评论中的建议,请参阅此相关主题。它并不特定Compass,但它提供了一种从日期生成ObjectIds 的解决方案,而不依赖于ObjectId.fromDate().