集合中的对象ID和唯一性

时间:2019-06-21 00:15:45

标签: mongodb mongoose

这是一个思想实验:

mongo中的ObjectID具有24个字符,因此,如果您使用它们构建URI,则会变得很麻烦。

每个字符都以16为底数,因此,如果我们获得最后8位数字,它将允许我们输入16 ^ 8(4,294,967,296)个唯一组合。

根据ObjectID specification,它由以下内容组成:

  

一个4字节的值,表示自Unix时代以来的秒数,
  5个字节的随机值,
  一个3字节的计数器,以随机值开头。

是否可以保证在一个集合中,如果我们使用最后4个字节(8个字符),则每个文档都将具有唯一的值?

这样,我可以在模型上创建.id属性,在.pre('save')上分配它,并在该属性上为集合创建索引。

我已经测试并确认它可以处理12,856,767个文档,并计划对其进行穷举测试,但是我想知道专家的意见,我完全不赞成这样做吗?

1 个答案:

答案 0 :(得分:3)

根据mongodb ObjectID的文档:

  

虽然ObjectId值应随时间增加,但它们不会   必然单调。这是因为它们:

     
      
  • 仅包含一秒的时间分辨率,因此在同一秒内创建的ObjectId值没有保证的顺序,并且
  •   
  • 由客户端生成,可能具有不同的系统时钟。
  •   

因此,简而言之,这表示您无法100%保证涉及ObjectId的唯一性。基本上,有机会发生冲突,尤其是对于同一主机在同一秒内大量产生的ObjectID。 在几乎所有情况下(正如您在1300万条记录中所看到的),这都不是问题,但仍有机会...

在mongo实例中的Timestamp保证是唯一的

  

BSON具有供MongoDB内部使用的特殊时间戳类型,而不是   与常规Date类型相关联。时间戳值为64位   值,其中:

     

前32位是time_t值(自Unix时代以来的秒数)   后32位是在   第二。

     

在单个mongod实例中,时间戳记值始终是唯一的。

尽管它清楚地表明这是internal use的代名词,但是如果您追求的是唯一的独特价值,那么您可能要考虑一下。