2

我有一组数据,我想按插入时间对其进行排序。我没有任何额外的字段来存储插入时间。但是当我发现我可以从 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 字段通过插入日期时间对集合进行排序?

4

2 回答 2

2

目前,这在 Meteor 上是不可能的,即使是在 MongoDB 上也是如此。使用流星创建的 ObjectID 不带有时间戳。请参阅http://docs.meteor.com/#collection_object_id

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

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

于 2013-10-04T10:09:44.140 回答
1

我删除的部分不准确。Meteor 使用它是自己的 id 生成,它基于随机字符串,而不会应用我之前链接的文档。检查下 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/

于 2013-10-04T09:33:41.660 回答