Mongodb:在mongo shell中使用ObjectId执行日期范围查询
Mongodb:在mongo shell中使用ObjectId执行日期范围查询
我有一个类似这样的集合:
{ _id: ObjectId("50a68673476427844b000001"), 其他字段 }
我想要进行一个范围查询,找出两个日期之间的记录。我知道可以通过mongo shell中的ObjectId获取日期,方法如下:
var aDate = ObjectId().getTimestamp()
但是目前我还没有找到一种方法可以创建一个只包含时间戳部分的ObjectId - 我认为我理想的解决方案是非工作中的mongo shell代码将是:
var minDate = ObjectId(new Date("2012-11-10")); var maxDate = ObjectId(new Date("2012-11-17"));
使用find命令,将minDate和maxDate作为范围值。
有没有办法在SHELL中做到这一点 - 我对某些驱动程序产品不感兴趣。
问题的原因是需要在MongoDB中执行一个基于日期范围的查询,查询的条件是根据ObjectId进行筛选。解决方法是使用mongo shell或Node.js驱动程序提供的方法来实现。
在mongo shell中,可以使用内置的ObjectId.fromDate方法来实现。代码如下:
db.mycollection.find({_id: {$gt: ObjectId.fromDate( new Date('2017-09-23') ) } });
在Node.js驱动程序中,可以使用stackoverflow网站上提供的解决方案。代码如下:
db.mycollection.find({_id: {$gt: ObjectID.createFromTime( Date.now()/1000 ) } });
以上是在MongoDB中执行日期范围查询的两种解决方法。
问题的出现原因是在MongoDB中,想要根据ObjectId的范围进行日期查询。解决方法是通过将日期转换为ObjectId,并使用$gt和$lt操作符进行查询。下面是一种可行的解决方法:
首先,我们可以将日期转换为对应的ObjectId。这可以通过以下代码实现:
var objIdMin = ObjectId(Math.floor((new Date('1990/10/10'))/1000).toString(16) + "0000000000000000") var objIdMax = ObjectId(Math.floor((new Date('2011/10/22'))/1000).toString(16) + "0000000000000000")
接下来,我们可以使用find()方法进行查询,并将objIdMin和objIdMax作为参数传递给$gt和$lt操作符。这可以通过以下代码实现:
db.myCollection.find({_id:{$gt: objIdMin, $lt: objIdMax}})
另外,我们也可以将上述两个步骤合并为一步,这样虽然可读性较差,但也是可行的。具体实现如下:
db.myCollection.find({_id:{$gt: ObjectId(Math.floor((new Date('1990/10/10'))/1000).toString(16) + "0000000000000000"), $lt: ObjectId(Math.floor((new Date('2011/10/10'))/1000).toString(16) + "0000000000000000")}})
此外,我们还可以使用一个函数来简化日期转换的过程。具体实现如下:
function dateFromObj( strDate ) { return ObjectId(Math.floor((new Date( strDate ))/1000).toString(16) + "0000000000000000") }
通过使用上述方法,我们可以在MongoDB中根据ObjectId的范围进行日期查询。