Mongo DB:获取最后一个已知文件后插入的所有文件

Nik*_*las 6 mongodb

> db.events.find()
{ "_id" : ObjectId("50911c3e09913b2c643f1215"), "context" : "jvc8irfjc9cdnf93", "key" : "value" }
{ "_id" : ObjectId("50911c4709913b2c643f1216"), "context" : "jvc8irfjc9cdnf93", "key" : "new value" }
{ "_id" : ObjectId("50911c4b09913b2c643f1217"), "context" : "jvc8irfjc9cdnf93", "key" : "newer value" }
{ "_id" : ObjectId("50911c4f09913b2c643f1218"), "context" : "jvc8irfjc9cdnf93", "key" : "newest value" }
{ "_id" : ObjectId("50911c6309913b2c643f1219"), "context" : "0djd8vcndkfnjhv3", "key" : "value" }
Run Code Online (Sandbox Code Playgroud)

是Mongo数据库服务器上的事件列表.客户端跟踪他知道的最后一个事件,例如50911c4709913b2c643f1216,第二个事件.

如何获取在此已知事件之后插入的所有事件?在这种情况下50911c4b09913b2c643f1217,50911c4f09913b2c643f121850911c6309913b2c643f1219.

Sam*_*aye 5

由于ObjectId默认情况下包含a inc和a timestamp(http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification),您实际上可以通过以下ObjectId方式使用它来了解插入时间(大致):

db.col.find({_id: {$gt: {ObjectId("50911c4709913b2c643f1216")}}});
Run Code Online (Sandbox Code Playgroud)

但是,ObjectId并不总是非常可靠,特别是如果在您的应用程序中,您ObjectId在插入之前创建了一段时间,并且实际上您知道之后创建的一条记录实际上显示(因为它_id)如前所述.

对于您不能信任ObjectId插入计时器的某些情况下的插入,您可以使用两个查询添加tsBSON日期类型(ISODate)的范围和范围,一个用于获取原始文档时间,然后另一个用于获取所有文档.

我个人更喜欢使用BSON日期类型的第二种方法,因为它更可靠和灵活.


Aja*_*rge 2

您在这里看到对象 ID 按递增顺序排列的原因是因为规范规定这 time|machine|pid|inc是创建ObjectId.

请注意, 中已经有一个时间分量ObjectId,但以秒为单位。
Mongo 中的类型Date是从纪元开始的毫秒数的表示,这将为您提供更精确的计算插入时间的方法。

我认为最好的方法是如果您需要超过毫秒的绝对精度,那么最好的方法是使用序列号形式的计数器,但如果您认为您的应用程序不是那么密集写入,只需使用称为附加键形式的日期类型时间戳。