8

我在多进程环境中使用 MongoDB,我想知道如何按插入顺序对查询进行排序并将其限制为在某个文档之后插入的文档。在单个进程上,我可以使用 ObjectID,但在同一秒内来自不同进程的两个 ObjectId 可能有错误的顺序。

例子:

ObjectId("5236dc5c 88ee6f 2075 bd0049")

之前可能是由进程 2075 生成的

 ObjectId("5236dc5c 88ee6f 2071 f35fb8")

由过程 2071。请注意,两个 ID 的时间戳部分相等 (5236dc5c)。此时间戳以秒为单位。

4

2 回答 2

11

使用 ObjectIds 或日期字段进行排序可能无法为您提供所需的结果。插入文档中的 ObjectId 和日期是在客户端生成的,因此如果您使用来自多台机器的连接运行,除非您的机器之间的时间完美,否则您将遇到排序不一致的情况。

你能提供更多关于你想要做什么的细节吗?有几种不同的方法可以从 MongoDB 获得所需的行为,具体取决于您需要在特定文档之后插入文档列表的原因。

例如,如果您尝试将文档的有序列表用作一种队列,则可以改为使用findAndModify命令来获取未读文档并自动更新“已读”字段以确保您不会阅读两次. 每次调用 findAndModify 都会找到集合中没有设置为 true 的读取字段的最新文档,自动将该字段设置为 true,然后将文档返回给客户端进行处理。

另一方面,如果您的用例确实需要按插入顺序排列的文档列表,您可以利用插入文档的自然顺序。在 MongoDB 中,文档按插入顺序写入磁盘,除非文档大小的更改或删除需要移动。通过使用保证保持自然顺序的上限集合,您可以通过利用它来获取文档列表。请注意,使用上限集合有几个主要限制,您可以在文档中找到这些限制。

于 2013-09-16T14:50:57.037 回答
4

To ensure insertion order one need an unique auto-incrementing sequence field. There are two recommended ways to implement this:

  1. Counters Collection
  2. Optimistic Loop

One thing to note which the documentation does not state: Only the Optimistic Loop does really ensure that insertion order equals sequence order. Still it's very likely for the Counters Collection approach, but it is not guaranteed by theory since the incrementation and the document insertion are two separate operations.

于 2015-04-02T10:37:18.057 回答