【问题标题】:Mongodb always increased "_id" field?Mongodb总是增加“_id”字段?
【发布时间】:2021-07-03 06:50:22
【问题描述】:

即使我们有多个分片,mongodb 中的_id 字段是否总是为集合中的下一个插入文档而增加?因此,如果我有collection.watch,下一个文档的_id 字段是否总是比上一个文档更高?我需要这个来实现追赶订阅而不丢失任何文件。因此,在来自collection.watch 的每个已处理文档上,我都会存储它的_id,如果发生崩溃 - 除了collection.watch 之外,我还可以选择具有_id > last_seen_id 的所有文档。

或者我必须使用某种自动增强值吗?我不想因为它会严重影响性能并杀死分片的原因。

【问题讨论】:

    标签: mongodb subscription changestream


    【解决方案1】:

    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 不提供此功能的原因。

    一种可能的解决方案:

    这不会让您排队。如果你想要一个队列,有各种提供队列的库和系统。

    【讨论】:

    • 当 ObjectID 的官方结构包含“机器 id”之类的东西时,一些客户端(流星)不管出于何种原因都没有打扰,只是随机设置所有字节。即使我们确实使用时间戳,也会有时钟漂移。所以是的,“大部分时间”是相当准确的,虽然这不是一个“保证”,是吗? :)
    • ObjectId 什么时候不增加?我的意思是,如果客户端不自己生成_id,那么 MongoDB 会
    • @VladyslavMozhvylo:例如,当时钟在分片之间漂移时
    • 那么,我有什么选择?我知道乐观锁定,但还有其他吗?
    • @VladyslavMozhvylo:或者,您可以确保您的ntpd 在所有服务器上都可以正常工作,并且可能有一定的重启余地(last_id - X 秒)。
    猜你喜欢
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多