Mongodb:从 mongo shell 中的 ObjectId 执行日期范围查询
Posted
技术标签:
【中文标题】Mongodb:从 mongo shell 中的 ObjectId 执行日期范围查询【英文标题】:Mongodb: Perform a Date range query from the ObjectId in the mongo shell 【发布时间】:2012-11-15 15:27:57 【问题描述】:我有一个如下所示的集合:
_id: ObjectId("50a68673476427844b000001"),
other fields
我想做一个范围查询来查找两个日期之间的记录。我知道我可以从 mongo shell var 中的 ObjectId 获取日期:
var aDate = ObjectId().getTimestamp()
但没有办法(据我目前所知)创建仅包含时间戳部分的 ObjectId - 我认为我理想的解决方案是无法正常工作的 mongo shell 代码:
var minDate = ObjectId(new Date("2012-11-10"));
var maxDate = ObjectId(new Date("2012-11-17"));
使用以 minDate 和 MaxDate 作为范围值的查找。
有没有办法在 SHELL 中做到这一点 - 我对某些驱动程序产品不感兴趣。
【问题讨论】:
mongoid 的前 8 个字节是十六进制的时间戳,因此您可以创建一个有效的 ObjectId,其中前 8 个字节从日期开始,然后只剩下零,然后执行类似以下的查询: _id: $gt: ObjectId("5087e5b106cffca815000000")
Can I query MongoDB ObjectId by date? 有一个很好的答案,其中包括一个 objectIdWithTimestamp()
javascript 函数。您可以将此功能保存在您的.mongorc.js 中,以便在启动时在您的mongo
shell 中使用它。
这能回答你的问题吗? Can I query MongoDB ObjectId by date?
【参考方案1】:
您可以分两步完成:
var objIdMin = ObjectId(Math.floor((new Date('1990/10/10'))/1000).toString(16) + "000
0000000000000")
var objIdMax = ObjectId(Math.floor((new Date('2011/10/22'))/1000).toString(16) + "000
0000000000000")
db.myCollection.find(_id:$gt: objIdMin, $lt: objIdMax)
或一步完成(可读性较差):
db.myCollection.find(_id:$gt: ObjectId(Math.floor((new Date('1990/10/10'))/1000).toString(16) + "000
0000000000000"), $lt: ObjectId(Math.floor((new Date('2011/10/10'))/1000).toString(16) + "000
0000000000000"))
【讨论】:
甚至更好:function dateFromObj( strDate ) return ObjectId(Math.floor((new Date( strDate ))/1000).toString(16) + "0000000000000000")
【参考方案2】:
使用 mongo shell:
您可以使用 ObjectId.fromDate 内置方法:
db.mycollection.find(_id: $gt: ObjectId.fromDate( new Date('2017-09-23') ) );
来自 Node.js 驱动程序:
您可以使用@jksduahere提供的解决方案如下:
db.mycollection.find(_id: $gt: ObjectID.createFromTime( Date.now()/1000 ) );
【讨论】:
以上是关于Mongodb:从 mongo shell 中的 ObjectId 执行日期范围查询的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB学习第二篇 --- Mac下通过 Shell 执行 mongo 命令
MongoDB - The mongo Shell, mongo Shell Quick Reference
MongoDB - The mongo Shell, Configure the mongo Shell