2012-11-27 61 views
18

从的ObjectId执行日期范围查询我有一个集合,看起来像这样:的MongoDB:在蒙戈外壳

{ 
    _id: ObjectId("50a68673476427844b000001"), 
    other fields 
} 

我想做一个范围查询两个日期之间找到记录。我知道,我可以从在的ObjectId蒙戈外壳VAR日期这样做:

var aDate = ObjectId().getTimestamp() 

但没有办法(据我可以在瞬间计算出)创建的ObjectId由刚时间戳部分 - 我认为我的理想的解决方案是不起作用的蒙戈外壳代码如下:

var minDate = ObjectId(new Date("2012-11-10")); 
var maxDate = ObjectId(new Date("2012-11-17")); 

使用带的minDate和MAXDATE的范围值查找。

有没有办法在壳里做这个 - 我不感兴趣,一些司机的产品。

+0

前8个字节mongoid所提供的解决方案是十六进制的时间戳,所以你可以创建一个从迄今取得前8个字节的有效的ObjectId,休息只是零和然后做类似于这样的查询:'{_id:{$ gt:ObjectId(“5087e5b106cffca815000000”)} }' – 2012-11-27 22:34:14

+0

有一个很好的答案[我可以通过日期查询MongoDB ObjectId吗?](http:// stackoverflow。 COM /问题/ 8749971 /罐-I-查询的mongodb-的objectid按日期),其包括一个'objectIdWithTimestamp()'JavaScript函数。您可以保存此功能在您的[.mongorc.js(http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell#Overview-TheMongoDBInteractiveShell-.mongorc.js)有它在启动时你'mongo'外壳可用。 – Stennie

回答

27

你可以在2个步骤:

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")}}) 
+0

甚至更​​好:'函数dateFromObj(strDate){ 返回的ObjectId(Math.floor((新日期(strDate))/ 1000)的ToString(16)+ “0000000000000000”) }' –

3

使用蒙戈外壳:

可以使用的ObjectId 。FromDate内置方法:

db.mycollection.find({_id:{$gt:ObjectId.fromDate(new Date('2017-09-23'))}}); 

从Node.js的驱动程序,您可以使用@jksdua here