我可以按日期查询 MongoDB ObjectId 吗?

IT技术 javascript mongodb
2021-01-28 20:54:57

我知道 ObjectIds 包含它们的创建日期。有没有办法查询 ObjectId 的这个方面?

6个回答

Popping Timestamps into ObjectIds涵盖了基于嵌入在 ObjectId 中的日期的非常详细的查询。

简而言之,JavaScript 代码:

/* This function returns an ObjectId embedded with a given datetime */
/* Accepts both Date object and string input */

function objectIdWithTimestamp(timestamp) {
    /* Convert string date to Date object (otherwise assume timestamp is a date) */
    if (typeof(timestamp) == 'string') {
        timestamp = new Date(timestamp);
    }

    /* Convert date object to hex seconds since Unix epoch */
    var hexSeconds = Math.floor(timestamp/1000).toString(16);

    /* Create an ObjectId with that hex timestamp */
    var constructedObjectId = ObjectId(hexSeconds + "0000000000000000");

    return constructedObjectId
}


/* Find all documents created after midnight on May 25th, 1980 */
db.mycollection.find({ _id: { $gt: objectIdWithTimestamp('1980/05/25') } });
非常方便..仅供参考,您可以将此功能保存在您的~/.mongorc.js文件中,以便在mongoshell 启动时使用它
2021-03-19 20:54:57
如果您像我一样使用 Mongoskin:更改ObjectId(hexSeconds + "0000000000000000");db.ObjectID.createFromHexString(hexSeconds + "0000000000000000");
2021-03-20 20:54:57
我正在使用带有 mongodbnative 的 nodejs。通过包含 var ObjectId = require('mongodb').ObjectID; 修复了“未定义错误”;
2021-03-21 20:54:57
或者,在 Mongoose 中,替换ObjectId()为:require('mongoose').Types.ObjectId()-require('mongoose')初始化/配置的 Mongoose 实例在哪里
2021-04-04 20:54:57
我收到 ReferenceError: ObjectId 未定义。我该如何解决?
2021-04-09 20:54:57

在 中pymongo,可以通过以下方式完成:

import datetime
from bson.objectid import ObjectId
mins = 15
gen_time = datetime.datetime.today() - datetime.timedelta(mins=mins) 
dummy_id = ObjectId.from_datetime(gen_time)
result = list(db.coll.find({"_id": {"$gte": dummy_id}}))
或者,不使用pymongo依赖项:(epoch_time_hex = format(int(time.time()), 'x') 不要忘记为您的查询附加零)使用时间包 ( import time)。
2021-03-16 20:54:57
意识到 OP 要求使用 javascript,但这确实帮助我简化了代码。谢谢。
2021-03-26 20:54:57
注意使用 datetime.datetime.utcnow() 或 datetime.datetime.today() 将返回相同的结果。日期时间是为你处理的。
2021-03-30 20:54:57

在 Node.js 中使用 mongodb 驱动程序提供的内置函数可以让您按任何时间戳查询:

var timestamp = Date.now();
var objectId = ObjectID.createFromTime(timestamp / 1000);

或者,要搜索当前时间之前的记录,您只需执行以下操作:

var objectId = new ObjectID(); // or ObjectId in the mongo shell

来源:http : //mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html

这是从 javascript 环境中的时间戳创建 ObjectId 的最佳/最简单的方法。这就是op要求的......
2021-04-01 20:54:57

$convert从 4.0 版本开始,您可以使用函数从 ObjectId 中提取日期。

就像是

$convert: { input: "$_id", to: "date" } 

您可以查询日期的开始和结束时间之间的日期比较。

db.collectionname.find({
  "$expr":{
    "$and":[
      {"$gte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T00:00:00.000Z")]},
      {"$lte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T11:59:59.999Z")]}
    ]
  }
})

或者

您可以使用速记$toDate来实现相同的目的。

db.collectionname.find({
  "$expr":{
    "$and":[
      {"$gte":[{"$toDate":"$_id"}, ISODate("2018-07-03T00:00:00.000Z")]},
      {"$lte":[{"$toDate":"$_id"},ISODate("2018-07-03T11:59:59.999Z")]}
    ]
  }
})
只是想问一下使用 $convert OR $toDate,Mongo 首先必须转换,然后比较 doc 是否存在于范围内,但是如果我使用接受的答案的方法,然后将日期转换为 ObjectId 我只需要做在客户端,只有一次,所以你不认为该解决方案会比这更有效吗?无论如何感谢您告诉这两个运算符也存在:)
2021-03-30 20:54:57

如何找到查找命令(this date[2015-1-12]to this Date[2015-1-15]):

db.collection.find({
  _id: {
    $gt: ObjectId(Math.floor((new Date('2015/1/12'))/1000).toString(16) + "0000000000000000"), 
    $lt: ObjectId(Math.floor((new Date('2015/1/15'))/1000).toString(16) + "0000000000000000")
  }
}).pretty()

计算命令(这个date[2015-1-12]到这个Date[2015-1-15]):

db.collection.count({
  _id: {
    $gt: ObjectId(Math.floor((new Date('2015/1/12'))/1000).toString(16) + "0000000000000000"), 
    $lt: ObjectId(Math.floor((new Date('2015/1/15'))/1000).toString(16) + "0000000000000000")
  }
})

删除命令(thisdate[2015-1-12]到 this Date[2015-1-15]):

db.collection.remove({
  _id: {
    $gt: ObjectId(Math.floor((new Date('2015/1/12'))/1000).toString(16) + "0000000000000000"), 
    $lt: ObjectId(Math.floor((new Date('2015/1/15'))/1000).toString(16) + "0000000000000000")
  }
})