用于mongodb ObjectId创build时间

在mongodb文档中用作默认键的ObjectIdembedded了时间戳(调用objectid.generation_time返回一个date时间对象)。 所以有可能使用这一代的时间,而不是保持一个单独的创build时间戳? 您将如何使用此embedded式时间戳,按创build时间sorting或查询最近N个项目?

我想,因为MongoDB的ObjectId包含一个时间戳,你可以按'创builddate'sorting,如果你将按objectIdsorting:

 items.find.sort( [['_id', -1]] ) // get all items desc by created date. 

如果你想要最后30个创build的项目,你可以使用下面的查询:

 items.find.sort( [['_id', -1]] ).limit(30) // get last 30 createad items 

我真的不知道,我只是假设按_idsorting应该如上所述。 我稍后会创build一些testing。

更新:

是的,它是如此。 如果您通过_id订购,您将自动按_id创builddate进行订购。 我在c#中做了小testing,有人对它感兴趣:

  public class Item { [BsonId] public ObjectId Id { get; set; } public DateTime CreatedDate { get; set; } public int Index { get; set; } } [TestMethod] public void IdSortingTest() { var server = MongoServer.Create("mongodb://localhost:27020"); var database = server.GetDatabase("tesdb"); var collection = database.GetCollection("idSortTest"); collection.RemoveAll(); for (int i = 0; i <= 500; i++) { collection.Insert(new Item() { Id = ObjectId.GenerateNewId(), CreatedDate = DateTime.Now, Index = i }); } var cursor = collection.FindAllAs<Item>(); cursor.SetSortOrder(SortBy.Descending("_id")); var itemsOrderedById = cursor.ToList(); var cursor2 = collection.FindAllAs<Item>(); cursor2.SetSortOrder(SortBy.Descending("CreatedDate")); var itemsOrderedCreatedDate = cursor.ToList(); for (int i = 0; i <= 500; i++) { Assert.AreEqual(itemsOrderedById[i].Index, itemsOrderedCreatedDate[i].Index); } } 

是的,你可以使用BSON ObjectId的generation_time来达到你想要的目的。 所以,

 db.collection.find().sort({ _id : -1 }).limit(10) 

将返回最近创build的10个项目。 但是,由于embedded的时间戳具有一秒的精度,因此在任何秒钟内的多个项目按其创build的顺序被存储。

使用c#驱动程序将DateTime转换为相应时间戳的代码如下所示:

  public static ObjectId ToObjectId(this DateTime dateTime) { var timestamp = (int)(dateTime - BsonConstants.UnixEpoch).TotalSeconds; return new ObjectId(timestamp, 0, 0, 0); } 

更多信息: http : //www.danharman.net/2011/10/26/mongodb-ninjitsu-using-objectid-as-a-timestamp/

看到

http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-DocumentTimestamps

可能可行,但是我总是更喜欢有一个专用的时间戳,而不是依赖像内部时间戳这样的内部某种对象IDembedded。

From: http : //www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-DocumentTimestamps

“对存储ObjectId值的_id字段进行sorting大致等同于按创build时间进行sorting,尽pipe这种关系对于在一秒钟内在多个系统上生成的ObjectId值并不严格。

要使用robomongo查询7天内创build的项目,我使用下面的函数:

 db.getCollection('projects').find({ $where: function() { // last 7 days return Date.now() - this._id.getTimestamp() < (7 * 24 * 60 * 60 * 1000) } }).sort({ '_id': -1 })