Mongodb ObjectID在文档之间是唯一的吗?



让我们考虑一个博客网站的例子,我想将问题和回复保存在两个不同的文档中。我知道这也可以用Embedding文档来完成,但让我们假设我们想要两个不同的文档。

我对问题和答复都有Like选择。如果用户喜欢某个问题,则该特定question's objectID存储在Like文档中,同样,对于回复中的喜欢。

现在我想知道我存储在Like文档中的objectID's是否会产生冲突。就像question's objectid像任何reply's objectid一样same.有没有可能发生这样的冲突??

在MongodbObjectID文档中提供了以下内容:

ObjectId 是一个 12 字节的 BSON 类型,使用以下方法构造:

一个 4 字节的值,表示自 Unix 纪元以来的秒数,

一个 3 字节机器标识符,

一个 2 字节的进程 ID,以及

一个 3 字节计数器,从随机值开始。

它对于所有实际目的都是独一无二的。提到的非唯一性是一个相当理论性的。

ObjectId 由

  • 时间戳(自纪元以来的秒数)
  • 计算机标识符
  • 进程标识
  • 以及每秒以随机值开头的 3 字节计数器

因此,在中位数,除非您每个客户端每秒写入超过 3080 个文档,否则您应该是安全的。 需要注意的是,_id有一个独特的约束:即使你尝试两次编写相同的 ObjectId,也会有一个例外。

旁注:即使是像MD5或(在较小程度上)SHA256这样的哈希算法也有轻微的冲突机会。但是有了独特的约束,你是安全的。

编辑:由于在非常,非常,非常罕见的情况下会引发异常,即生成两个相同的ObjectId并尝试同时写入,因此您只需通过生成新的ObjectId来处理它们并尝试再次保存文档。

从文档中看,它很可能是唯一的,而不是唯一的。

最新更新