让我们考虑一个博客网站的例子,我想将问题和回复保存在两个不同的文档中。我知道这也可以用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来处理它们并尝试再次保存文档。
从文档中看,它很可能是唯一的,而不是唯一的。