如何仅通过ObjectID在MongoDB中查询日期之间的数据?
从这段内容中可以得到以下问题的原因和解决方法:
问题:如何通过ObjectID在MongoDB中只查询日期之间的数据?
原因:在MongoDB中,ObjectID中嵌入了日期信息,因此可以通过ObjectID进行日期范围的查询。
解决方法:可以使用以下JavaScript代码来实现查询:
/* 这个函数返回一个带有给定日期时间的嵌入式ObjectId */ /* 接受Date对象和字符串输入 */ function objectIdWithTimestamp(timestamp) { /* 将字符串日期转换为Date对象(否则假设timestamp是一个日期) */ if (typeof(timestamp) == 'string') { timestamp = new Date(timestamp); } /* 将日期对象转换为十六进制秒数(自Unix纪元以来) */ var hexSeconds = Math.floor(timestamp/1000).toString(16); /* 使用该十六进制时间戳创建一个ObjectId */ var constructedObjectId = ObjectId(hexSeconds + "0000000000000000"); return constructedObjectId } /* 查找所有在1980年5月25日午夜之后创建的文档 */ db.mycollection.find({ _id: { $gt: objectIdWithTimestamp('1980/05/25') } });
如果在使用上述代码时遇到"ReferenceError: ObjectId is not defined"错误,可以通过包含var ObjectId = require('mongodb').ObjectID;
来修复该错误。
如果使用Mongoskin,则将ObjectId(hexSeconds + "0000000000000000");
更改为db.ObjectID.createFromHexString(hexSeconds + "0000000000000000");
。
在Mongoose中,可以将ObjectId()
替换为require('mongoose').Types.ObjectId()
,其中require('mongoose')
是已初始化/配置的Mongoose实例。
对于1978年6月7日之前的日期,这个方法为什么会失败?有什么特殊之处?尝试使用1970年1月1日,但令人震惊的是它不起作用。
如果在mongo shell中使用此方法时抛出"ReferenceError: timestamp is not defined"错误。解决方法是将开放的大括号移到与function
相同的行上。
要直接从shell中调用函数,请使用:db.loadServerScripts();
如果您正在使用RoboMongo或类似的工具,为了使用存储的函数,您需要首先运行"db.loadServerScripts();"。
无法使用mongodump
来导出数据,所以如何使用ObjectID作为条件导出大量数据呢?
问题的出现原因是用户想要通过ObjectID在MongoDB中查询指定日期范围内的数据。解决方法是使用Node.js中MongoDB驱动程序提供的内置函数来查询任何时间戳。用户可以通过以下代码创建一个ObjectID:
var timestamp = Date.now(); var objectId = ObjectID.createFromTime(timestamp / 1000);
另外,用户还可以使用以下代码查询当前时间之前的记录:
var objectId = new ObjectID();
以上代码可以在Mongo Shell中使用ObjectId来替代new ObjectID()。
参考链接:http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html
这是在JavaScript环境中根据时间戳创建ObjectID的最佳/最简单的方法,也是问题提出者所需的方法。
在使用mongodb进行日期查询时,我们可以使用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}}))
需要注意的是,使用datetime.datetime.utcnow()或者datetime.datetime.today()返回的结果是相同的。时间处理由库自动完成。
另外,如果不想依赖pymongo库,我们也可以使用以下代码:
epoch_time_hex = format(int(time.time()), 'x')
请注意将结果添加到查询条件中时,需要添加零。这里使用了time库。
虽然OP是在询问javascript的方法,但是这个方法对我简化了代码,非常感谢。