如何从Mongo ObjectID中提取创建的日期

时间:2011-09-06 23:26:34

标签: shell mongodb timestamp unix-timestamp

我正在使用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});

4 个答案:

答案 0 :(得分:93)

getTimestamp()

你需要的功能是这个,它已经包含在你的shell中了:

ObjectId.prototype.getTimestamp = function() {
    return new Date(parseInt(this.toString().slice(0,8), 16)*1000);
}

参考

从文档中查看此部分:

这个单元测试也说明了相同的内容:

使用Mongo shell的示例:

> 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.