存储在每个文档的_id字段中的自动生成的BSON ID是GUID吗? 文档说它“最有可能”,所以我有点困惑。为什么他们会使用不保证唯一的ID?
答案 0 :(得分:7)
它的独特性基于概率。不像@mattexx回答:
由于MongoDB没有强制执行唯一性来节省时间,因此不能“保证”是唯一的。
MongoDB在ObjectId
上强制执行uniqness,它实际上在_id
字段上有唯一索引。在谈论节省时间时,ObjectId
是历史性的,因为它是在MongoDB没有进行任何写入并且需要99%的机会能够在没有客户端等待的情况下插入新的唯一记录的情况下设计的。对于ack(ObjectIds是客户端生成的)。
它们不是GUID,但正如@Asya所说,它们保证具有高水平的单一性。
只要时间永远不会倒退,仍有99%的可能性永远是独一无二的。好吧,正如@Devesh所说,有一个,1:1万亿(?没有完成数学计算),甚至GUID被复制的可能性,但是,我认为你不会很快达到这个概率。
答案 1 :(得分:4)
它在大多数需求中是唯一的,它由时间戳,机器的唯一标识符(机器主机的散列),进程标识符以及最后的增量编号组成。 http://docs.mongodb.org/manual/reference/object-id/
答案 2 :(得分:2)
ID冲突的可能性理论上接近于零,可以推测它适用于典型的网络应用程序。许多真实世界的系统(Mongo或非Mongo)确实依赖于GUID的这种属性,尽管它对安全/关键任务系统来说不是一个好的假设。
在实用术语中,如果出现配置错误或第三方库错误,确实会出现问题。那些不应该排除这个概念,但重要的是要意识到这些风险并尽可能避免它们。
可能导致碰撞的一些good analysis here实际问题。特别是:
一些Mongo驱动程序使用随机数而不是递增计数字节的数字。在这些情况下,有1 / 16,777,216的机会生成非唯一ID,但仅当这两个ID在同一秒内生成时(即在ID的时间段更新到下一秒之前),在同一秒内生成机器,在同一个过程中。
答案 3 :(得分:0)
文档here中解释了ObjectId。由于MongoDB没有强制实现唯一性以节省时间,因此不能“保证”是唯一的。它只是相信复杂的生成算法可能永远不会在同一个数据存储区中生成两个相同的ObjectId。所以从技术上讲,它不是GUID,而是非常好。