问题描述
即使我们有多个分片,mongodb 中的 _id
字段是否总是为集合中的下一个插入文档增加?因此,如果我有 collection.watch
,下一个文档的 _id
字段是否总是比前一个文档更高?我需要这个来实现追赶订阅而不是丢失任何文件。因此,在来自 collection.watch
的每个处理过的文档中,我存储它的 _id
,如果崩溃 - 除了 _id
之外,我还可以选择所有带有 last_seen_id
> collection.watch
的文档。
或者我必须使用某种自动激活的值吗?我不想因为它会严重影响性能并杀死分片的原因。
解决方法
ObjectIds 保证在大多数时间单调增加,但不是所有时间。请参阅 What does MongoDB's documentation mean when it says ObjectIDs are "likely unique"? 和 Can a 4 byte timestamp value in MongoDb ObjectId overflow?。如果您需要有保证的单调递增计数器,则需要自己实现。
正如您所指出的,在分布式环境中实现这不是一件小事,这就是 MongoDB 不提供此功能的原因。
一种可能的解决方案:
- 有一个专门的柜台收藏
- 使用
{i: 1}
之类的文档为集合播种 - 发出使用 https://docs.mongodb.com/manual/reference/operator/update/inc/ 且无条件的查找和修改操作(从而影响集合中的所有文档,即作为计数器的唯一文档)
- 请求新文档作为更新结果(例如https://docs.mongodb.com/ruby-driver/master/tutorials/ruby-driver-crud-operations/#update-options
return_document: :after
) - 使用返回值作为计数器
这不会让你排队。如果您需要队列,可以使用各种库和系统来提供队列。