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

时间:2012-10-31 12:47:17

标签: 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" }

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

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

4 个答案:

答案 0 :(得分:5)

由于ObjectId默认包含inctimestamphttp://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification),因此您实际上可以使用ObjectId来了解插入时间(粗略)通过:

db.col.find({_id: {$gt: {ObjectId("50911c4709913b2c643f1216")}}});

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

对于您无法信任ObjectId插入计时器的某些情况下的插入,您可以使用两个查询添加BSON日期类型(ts)的ISODate字段和范围,一个获取原始文件的时间,然后另一个获得所有文件。

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

答案 1 :(得分:1)

在您的示例中,您使用的是“内置”ObjectID。 They attempt to be unique, not sequential。您可以添加时间戳和/或使用序列号作为官方文档建议和基于该属性的查询。

添加此新属性后,您必须执行两个查询。一个获取与客户端指定的ID相对应的序列号或时间戳,然后获取另一个查询以获取之后插入的项目。

答案 2 :(得分:1)

你在这里按顺序看到对象id的原因是因为规范说明了这一点 time|machine|pid|inc是用于创建ObjectId

的格式

请注意,ObjectId中已有一个时间组件,但只有几秒钟 Mongo中的Date类型表示从纪元开始的毫秒数,这将为您提供更准确的插入时间。

我认为最好的方法是使用 Sequence numbers 形式的计数器,如果您需要超过毫秒的绝对精度,但如果您认为您的应用不是那么写密集只需使用名为timestamp的附加键形式的 Date 类型。

答案 3 :(得分:0)

由于ObjectID基于其他人已经提到的时间,我们可以构建自己的基于时间的ObjectID进行查询。这应该节省索引空间:)

有关Javascript中的实现,请参阅https://stackoverflow.com/a/8753670/1008449