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

4 回答 4

10

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

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

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

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

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

于 2012-10-31T13:32:47.803 回答
2

您在此处看到对象 id 以递增顺序排列的原因是因为规范说这 time|machine|pid|inc是创建ObjectId.

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

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

于 2012-10-31T13:48:27.530 回答
1

在您的示例中,您使用的是“内置”ObjectID。他们试图是唯一的,而不是顺序的。您可以添加时间戳或使用官方文档建议的序列号,并根据该属性进行查询。

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

于 2012-10-31T12:58:04.200 回答
0

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

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

于 2013-11-09T11:18:45.443 回答