2013-10-04 37 views
2

我有一个数据集合,我想通过插入时间对它进行排序。我没有任何额外的字段来存储插入时间。但正如我found out我可以从Id这一次。使用唯一标识符字段对插入日期时间进行排序

我曾尝试这样的代码:

return bookmarks.find({}, {sort: {_id.getTimestamp(): 1}, limit: 10}); 

return bookmarks.find({}, {sort: {ObjectId(_id).getTimestamp(): 1}, limit: 10}); 

,但得到的错误信息:

=> Your application has errors. Waiting for file change. 

有什么办法通过插入日期时间只使用排序集合ID字段?

回答

2

目前这对Meteor来说是不可能的,即使它是在MongoDB中也是如此。用流星创建的ObjectID不包含时间戳。请参阅http://docs.meteor.com/#collection_object_id

原因是客户端代码可以插入代码,并且可以在服务器上延迟到达,因此不能保证ObjectID的时间戳部分是准确的。除了延迟之外,客户端的日期被使用意味着它们是否关闭会导致错误的数据。我认为这是他们使用ObjectID的原因,但它完全是随机的。

如果你想按日期排序,你必须单独存储时间/日期。

+1

也许使用服务器端收集钩子来创建文档时注入时间戳会在这里有所帮助? –

1

我敲出的部分不准确。流星使用它是自己的身份证代,这是基于一个随机字符串,虽然不适用我以前链接的文档。检查下sasha.sochka的评论。

如果您只是对_id字段进行排序,它几乎不是100%。虽然在构建时,前4个字节是以秒为单位的时间戳(因此对getTimestamps值进行排序并不会更好)。在一秒钟的分辨率下,您无法得到确切的订单,因为它在文档中提到: http://docs.mongodb.org/manual/reference/object-id/#objectid

您仍然可以尝试检查oplog中针对您的集合的插入/更新操作的确切顺序,如果你有一个oplog,但是无论如何,因为它是一个封顶的集合,你只会看到最近的操作。 http://docs.mongodb.org/manual/core/replica-set-oplog/

+0

这是不正确的关于流星的mongodb。 Meteor使用它自己修改的mongo中的ObjectID。 –

+0

对我而言,你是对的,我更新了我的答案。 – attish

相关问题