在多进程环境中按插入顺序对MongoDB查询进行排序和限制

dav*_*idn 7 mongodb

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

例:

ObjectId("5236dc5c 88ee6f 2075 bd0049")
Run Code Online (Sandbox Code Playgroud)

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

 ObjectId("5236dc5c 88ee6f 2071 f35fb8")
Run Code Online (Sandbox Code Playgroud)

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

3rf*_*3rf 11

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

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

例如,如果您尝试将该有序文档列表用作一种队列,则可以使用findAndModify命令获取未读文档并原子地更新"读取"字段以保证您不会读取它两次.每次调用findAndModify都会在集合中找到最新文档而不将read字段设置为true,将该字段原子设置为true,并将文档返回给客户端进行处理.

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


dav*_*idn 4

为了确保插入顺序,需要一个唯一的自动递增序列字段。有两种推荐的方法来实现这一点:

  1. 专柜系列
  2. 乐观循环

需要注意的一件事是文档没有说明:只有乐观循环才能真正确保插入顺序等于序列顺序。对于计数器集合方法来说,这仍然是很可能的,但理论不能保证它,因为增量和文档插入是两个单独的操作。