Mongodb:在mongo shell中使用ObjectId执行日期范围查询

13 浏览
0 Comments

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中做到这一点 - 我对某些驱动程序产品不感兴趣。

0
0 Comments

问题的原因是需要在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中执行日期范围查询的两种解决方法。

0
0 Comments

问题的出现原因是在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的范围进行日期查询。

0