如何仅通过ObjectID在MongoDB中查询日期之间的数据?

22 浏览
0 Comments

如何仅通过ObjectID在MongoDB中查询日期之间的数据?

我知道ObjectIds包含它们创建的日期。是否有一种方法可以查询ObjectId的这个方面?

0
0 Comments

从这段内容中可以得到以下问题的原因和解决方法:

问题:如何通过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作为条件导出大量数据呢?

0
0 Comments

问题的出现原因是用户想要通过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的最佳/最简单的方法,也是问题提出者所需的方法。

0
0 Comments

在使用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的方法,但是这个方法对我简化了代码,非常感谢。

0