MongoDB的ObjectIds是GUID吗?

17

存储在每个文档的 _id 字段中的自动生成的 BSON ID,是一个 GUID 吗?文档说它“很可能是唯一的”,所以我有点困惑。为什么他们会使用一个不能保证唯一性的 ID 呢?


1
它保证至少我从未见过真正的冲突。有大量关于编码内容的文档。 - Asya Kamsky
1
即使GUID不能保证其唯一性,但它们的形式使它们在大多数情况下都是唯一的。 - Devesh
4个回答

8
它的独特性基于概率。与@mattexx的回答不同:

MongoDB并不强制保证唯一性以节省时间,因此它不能“保证”唯一。然而,对于ObjectId,MongoDB确实强制执行唯一性,并且在_id字段上有一个唯一索引。在谈论节省时间时,ObjectId是历史性的,因为它是在MongoDB没有确认任何写入并需要99%的新插入记录可以在客户端等待确认时生成的(ObjectIds由客户端生成)。

它们不是GUID,但正如@Asya所说,它们保证具有高水平的唯一性。

只要时间永远不后退,就仍有99%的机会它将永久保持唯一。好吧,正如@Devesh所说,即使GUID重复的机会是1 / 1万亿(?还没有计算),但我认为您不会很快达到那个概率。

4

2

理论上讲,ID 冲突的机会足够接近于零,以至于可以在典型的 Web 应用程序中假定这一点。许多现实世界的系统(无论是 Mongo 还是其他)确实依赖于 GUID 的这个属性,但对于安全/关键任务系统来说,这不是一个好的假设。

从实际角度来看,如果存在配置错误或第三方库错误等问题,确实有可能出现问题。这些问题不应该排除这个概念,但需要注意这些风险并在可能的情况下避免它们。

这里有一些 有关实际问题的良好分析。特别是:

一些 Mongo 驱动程序使用随机数而不是递增数字作为计数器字节。在这些情况下,只有在同一台机器上、同一进程中生成这两个 ID 时,才有 1/16,777,216 的机会生成一个非唯一的 ID,但前提是在相同的秒数内(即在 ID 的时间部分更新到下一秒之前)。


0

ObjectId在文档这里中有解释。它并不“保证”唯一,因为MongoDB为了节省时间而没有强制执行唯一性。它只是相信复杂的生成算法可能永远不会在同一个数据存储中产生两个相同的ObjectId。因此,从技术上讲它并不是GUID,但基本上是一样好的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接