存储在每个文档的 _id 字段中的自动生成的 BSON ID,是一个 GUID 吗?文档说它“很可能是唯一的”,所以我有点困惑。为什么他们会使用一个不能保证唯一性的 ID 呢?
这个东西在大多数要求中是独一无二的,由时间戳、机器唯一标识符(主机哈希)、进程标识符和递增数字组成。http://docs.mongodb.org/manual/reference/object-id/
理论上讲,ID 冲突的机会足够接近于零,以至于可以在典型的 Web 应用程序中假定这一点。许多现实世界的系统(无论是 Mongo 还是其他)确实依赖于 GUID 的这个属性,但对于安全/关键任务系统来说,这不是一个好的假设。
从实际角度来看,如果存在配置错误或第三方库错误等问题,确实有可能出现问题。这些问题不应该排除这个概念,但需要注意这些风险并在可能的情况下避免它们。
这里有一些 有关实际问题的良好分析。特别是:
一些 Mongo 驱动程序使用随机数而不是递增数字作为计数器字节。在这些情况下,只有在同一台机器上、同一进程中生成这两个 ID 时,才有 1/16,777,216 的机会生成一个非唯一的 ID,但前提是在相同的秒数内(即在 ID 的时间部分更新到下一秒之前)。
ObjectId在文档这里中有解释。它并不“保证”唯一,因为MongoDB为了节省时间而没有强制执行唯一性。它只是相信复杂的生成算法可能永远不会在同一个数据存储中产生两个相同的ObjectId。因此,从技术上讲它并不是GUID,但基本上是一样好的。