仅使用id字段按插入日期时间对集合进行排序

时间:2013-10-04 08:49:43

标签: mongodb meteor

我有一组数据,我希望按插入时间排序。我没有任何其他字段来存储插入时间。但正如我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 个答案:

答案 0 :(得分:2)

目前Meteor无法做到这一点,即使它与MongoDB有关。使用meteor创建的ObjectID没有时间戳。见http://docs.meteor.com/#collection_object_id

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

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

答案 1 :(得分:1)

我所剔除的部分并不准确。流星使用它是自己的id生成,它基于随机字符串,但是不适用我之前链接的文档。检查sasha.sochka的评论。

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

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

相关问题