mongodb - 在两个不同的集合中生成重复的 Mongo ObjectId 的可能性?

是否可以为两个不同集合中的文档生成完全相同的 Mongo ObjectId?我意识到这绝对是不可能的,但有可能吗?

没有太具体,我问的原因是,通过我正在开发的应用程序,我们显示民选官员的公开个人资料,我们希望将他们转变为我们网站的正式用户。 We have separate collections for users and the elected officials who aren't currently members of our site. There are various other documents containing various pieces of data about the elected officials that all map back to the person using their elected official ObjectId.

After creating the account we still highlight the data that's associated to the elected official but they now also are a part of the users collection with a corresponding users ObjectId to map their profile to interactions with our application.

几个月前,我们已经开始将我们的应用程序从MySQL转换为Mongo,在过渡时,我们为这两种数据类型存储了旧版MySQL ID,现在我们也开始存储民选的Mongo Objectid官方in the users document to map back to the elected official data.

I was pondering just specifying the new user ObjectId as the previous elected official ObjectId to make things simpler but wanted to make sure that it wasn't possible to have a collision with any existing user ObjectId.

感谢您的洞察力。

编辑:发布此问题后不久,我意识到我提出的解决方案不是一个好主意。最好只保留我们现有的架构,并在用户文档中链接到选定的官方“_id”。

最佳答案

简答

直接回答您最初的问题:是的,如果您使用 BSON 对象 ID 生成,那么对于大多数驱动程序,ID 几乎肯定会在集合中是唯一的。请参阅下文了解“几乎可以肯定”的含义。

长答案

Mongo DB 驱动程序生成的 BSON 对象 ID 很可能在集合中是唯一的。这主要是因为 ID 的最后 3 个字节,对于大多数驱动程序是通过静态递增计数器生成的。该计数器是独立于收集的;它是全局性的。例如,Java 驱动程序使用随机初始化的静态 AtomicInteger。

那么,为什么在 Mongo 文档中,他们说 ID“很可能”是唯一的,而不是直接说它们将是唯一的?如果您无法获得唯一 ID,可能会出现三种可能性(如果还有更多,请告诉我):

在讨论之前,请记住 BSON 对象 ID 包括:

[4 字节秒数,3 字节机器哈希,2 字节进程 ID,3 字节计数器]

以下是三种可能性,您自己判断上当受骗的可能性有多大:

1) 计数器溢出:计数器有 3 个字节。如果您碰巧在一秒钟内插入超过 16,777,216 (2^24) 个文档,在同一台机器上,在同一进程中,那么您可能会溢出递增的计数器字节并最终得到两个共享同一时间的对象 ID,机器、进程和计数器值。

2) 计数器不递增:一些 Mongo 驱动程序使用随机数而不是递增计数器字节数。在这些情况下,有 1/16,777,216 的机会生成非唯一 ID,但前提是这两个 ID 在同一秒内(即在 ID 的时间段更新到下一秒之前),在同一时间机器,在同一个过程中。

3) 机器和进程散列到相同的值。在极不可能的情况下,机器 ID 和进程 ID 值可能会映射到两台不同机器的相同值。如果发生这种情况,并且同时两台不同机器上的两个计数器在同一秒内生成相同的值,那么您最终会得到一个重复的 ID。

这是需要注意的三种情况。场景 1 和 3 似乎不太可能,如果您使用正确的驱动程序,场景 2 是完全可以避免的。您必须检查驱动程序的来源才能确定。

https://stackoverflow.com/questions/4677237/

相关文章:

javascript - 找不到模块 '../build/Release/bson' ] 代码 :

mongodb - DynamoDB 与 MongoDB NoSQL

database - MongoDB 中的 findAndModify 和 update 有什么区别

macos - mongodb,macos - 限制警告

datetime - 在 mongodb 中存储日期/时间的最佳方法

mongodb - 减少 MongoDB 数据库文件大小

mongodb - MongoDB 的命名约定是什么?

mongodb - Elasticsearch vs.用于过滤应用程序的 MongoDB

database - 如何列出 mongo shell 中的所有数据库?

MongoDB - 管理员用户未授权