为了账号安全,请及时绑定邮箱和手机立即绑定

在两种不同的藏品中产生重复的Mono Objectid的可能性?

/ 猿问

在两种不同的藏品中产生重复的Mono Objectid的可能性?

料青山看我应如是 2019-07-27 15:15:24

在两种不同的藏品中产生重复的Mono Objectid的可能性?

是否有可能为两个不同集合中的文档生成相同的mongoobjectid?我知道这绝对不太可能,但有可能吗?

不太具体,我问的原因是,在我正在开发的应用程序中,我们展示了民选官员的公共信息,我们希望他们能成为我们网站的正式用户。我们有单独的收集用户和选举出的官员谁目前不是我们的网站成员。还有其他各种文件,其中载有关于当选官员的各种数据,所有这些数据都是使用其当选官员的对象映射回该人的。

在创建帐户之后,我们仍然突出显示与当选官员相关的数据,但它们现在也是用户集合的一部分,具有相应的用户对象,以便将他们的概要文件映射到与我们的应用程序的交互中。

几个月前,我们已经开始将我们的应用程序从MySQL转换到MONGO,在我们处于过渡阶段时,我们存储这两种数据类型的遗留MySQL id,我们现在也开始在用户文档中存储选定的官方MONGO对象,以映射回所选的官方数据。

我只是在考虑将新的用户Objectid指定为上一次当选的正式Objectid,以使事情变得更简单,但希望确保不可能与任何现有的用户Objectid发生冲突。

谢谢你的洞察力。

编辑:在发布这个问题后不久,我意识到我提出的解决方案不是一个很好的主意。最好只保留我们现有的当前模式,只需链接到用户文档中的当选官员‘_id’。



查看完整描述

3 回答

?
慕哥6287543

ObjectId是以类似于UUID的方式生成客户端的,但是具有一些更好的存储在数据库中的属性,例如粗略地增加顺序和免费编码它们的创建时间。您的用例的关键是,即使它们是在不同的机器上生成的,它们的设计目的也是为了保证高概率的唯一性。

现在,如果您通常是指_id字段,那么我们不需要跨集合的唯一性,因此重用旧的_id是安全的。作为一个具体的例子,如果您有两个集合,colorsfruits,两者都可以同时拥有一个对象,如{_id: 'orange'}.

如果您想了解关于如何创建ObjectID的更多信息,下面是规范:http:/www.monGodb.org/Display/DOCS/Object+IDS#ObjectID-BSONObjectID规范




查看完整回答
反对 回复 2019-07-28
?
慕娘9325324

如果有人对重复的MONGO对象ID有问题,您应该知道,尽管MONGO本身不太可能发生DUMP,但是在MONGO中用PHP生成COLICATE_ID是可能的。

对于我来说,这种情况经常发生的用例是,当我循环遍历数据集并试图将数据注入集合时。

保存注入数据的数组必须在每次迭代中显式地重置-即使您没有指定_id值。由于某些原因,插入进程将MOGO_ID添加到数组中,就好像它是一个全局变量(即使数组没有全局范围)。这可能会影响您,即使是在单独的函数调用中调用插入时,通常都希望数组的值不会持久化回调用函数。

对此有三种解决办法:

  1. 你可以的

    unset()

    数组中的_id字段
  2. 可以重新初始化整个数组。

    array()

    每次遍历数据集时
  3. 您可以自己显式地定义_id值(注意不要自己生成dups)。

我的猜测是,这是PHP接口中的一个bug,而不是MONGO的问题,但是如果遇到这个问题,只需取消_id就可以了。



查看完整回答
反对 回复 2019-07-28
?
阿波罗的战车

简短回答

只是为了直接回答您最初的问题:是的,如果您使用bson对象ID生成,那么对大多数司机来说ID在集合中几乎肯定是唯一的。以下是“几乎肯定”的含义。

长答案

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

那么,为什么在蒙古族的文档中,他们说ID“很可能”是唯一的,而不是直截了当地说它们是独一无二的呢?在无法获得唯一ID的情况下,可能会出现三种情况(如果有更多的ID,请告诉我):

在讨论之前,回想一下BSON对象ID包括:

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

这里有三种可能性,所以你自己判断被骗的可能性有多大:

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

2)计数器不递增:一些MONGO驱动程序使用随机数,而不是对计数器字节增加数字。在这些情况下,生成非唯一ID的几率为1/16,777,216,但前提是这两个ID是在同一秒钟(即在ID的时间部分更新到下一个秒之前)在同一台机器上在同一进程中生成的。

3)机器和进程哈希值相同。在某些极不可能的情况下,机器ID和进程ID值可能映射到两台不同机器的相同值。如果发生这种情况,同时两台不同机器上的两个计数器在同一秒钟内生成相同的值,那么您将得到一个重复的ID。

这是需要注意的三种情况。场景1和3看起来非常不可能,如果您使用正确的驱动程序,那么场景2是完全可以避免的。你必须检查司机的来源才能确定。



查看完整回答
反对 回复 2019-07-28

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信