【问题标题】:Mongodb: Perform a Date range query from the ObjectId in the mongo shellMongodb:从 mongo shell 中的 ObjectId 执行日期范围查询
【发布时间】: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?

标签: mongodb mongodb-shell


【解决方案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 ) } });

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多