我正在使用Mongo shell来查询我的Mongo数据库。我想使用ObjectID中包含的时间戳作为我的查询的一部分,也作为一个列提取到输出中。我已经设置了Mongo来自己创建ObjectID。
我的问题是我无法找到如何使用ObjectID来提取其时间戳。
以下是我想要开始工作的查询。 'createdDate'字段是占位符;不确定正确的字段是什么:
//Find everything created since 1/1/2011
db.myCollection.find({date: {$gt: new Date(2011,1,1)}});
//Find everything and return their createdDates
db.myCollection.find({},{createdDate:1});
答案 0 :(得分:93)
你需要的功能是这个,它已经包含在你的shell中了:
ObjectId.prototype.getTimestamp = function() {
return new Date(parseInt(this.toString().slice(0,8), 16)*1000);
}
从文档中查看此部分:
这个单元测试也说明了相同的内容:
> db.col.insert( { name: "Foo" } );
> var doc = db.col.findOne( { name: "Foo" } );
> var timestamp = doc._id.getTimestamp();
> print(timestamp);
Wed Sep 07 2011 18:37:37 GMT+1000 (AUS Eastern Standard Time)
> printjson(timestamp);
ISODate("2011-09-07T08:37:37Z")
答案 1 :(得分:16)
This question有助于了解如何在查询情境中使用_id的嵌入式时间戳(请参阅Mongo Extended JSON文档)。这就是它的完成方式:
col.find({...,
'_id' : {'$lt' : {'$oid' : '50314b8e9bcf000000000000'}}
})
查找比oid给出的文档更早创建的文档。与自然排序和限制一起使用,您可以利用BSON _ids创建类似Twitter的API查询(给我你最后的OID,我将再提供20个)
答案 2 :(得分:3)
在python中你可以这样做:
>>> from bson.objectid import ObjectId
>>> gen_time = datetime.datetime(2010, 1, 1)
>>> dummy_id = ObjectId.from_datetime(gen_time)
>>> result = collection.find({"_id": {"$lt": dummy_id}})
我认为,ObjectId.from_datetime() - 它是标准bson lib的有用方法 也许其他语言绑定具有替代的内置函数。 资料来源:http://api.mongodb.org/python/current/api/bson/objectid.html
答案 3 :(得分:1)
要使用ObjectId中包含的时间戳记并返回在特定日期之后创建的文档,可以将$where
与函数一起使用。
例如
db.yourcollection.find( {
$where: function() {
return this._id.getTimestamp() > new Date("2020-10-01")
}
});
该函数需要返回真实值,该文档才能包含在结果中。参考:$where
Mongo日期对象似乎有些奇怪。有关构造函数的详细信息,请参见mongo Date() documentation。
节选:
You can specify a particular date by passing an ISO-8601 date string with a year within the inclusive range 0 through 9999 to the new Date() constructor or the ISODate() function. These functions accept the following formats:
new Date("<YYYY-mm-dd>") returns the ISODate with the specified date.
new Date("<YYYY-mm-ddTHH:MM:ss>") specifies the datetime in the client’s local timezone and returns the ISODate with the specified datetime in UTC.
new Date("<YYYY-mm-ddTHH:MM:ssZ>") specifies the datetime in UTC and returns the ISODate with the specified datetime in UTC.
new Date(<integer>) specifies the datetime as milliseconds since the Unix epoch (Jan 1, 1970), and returns the resulting ISODate instance.