MongoDB _id 字段有多独特?

KDe*_*ker 3 schema mongodb

我正在尝试为我正在创建的 MongoDB 数据库的文档和集合创建模式。我已经阅读了一些文档,描述_id每个文档在创建时生成的字段。

我还阅读了这篇关于在 Mongo 中实现一对多关系的文章,并决定我的案例属于“一对多”类别。因此,我将从我的“当前”集合中字段引用多个其他集合中的多个其他文档_id。从我在文章中可以看出,这似乎可以正常工作。虽然我依稀记得读过一篇文章说_id字段不能保证在不同的集合中是唯一的,但它们在集合内(原谅我,我找不到它的链接)。

例如,假设我为一家销售苹果和橙子的公司收集了三个系列;OrdersApples、 和OrangesOrders持有有关苹果和橙子订单的文件。ApplesOranges保存有关这些水果的各种类型的数据。

Orders文档中,我可能有字段

{
    ...
    "OrangesOrdered" :
    [
        { "Amount" : 2, "OrangeID" : "OrangeObjectID12"}
    ]
    ...
    "ApplesOrdered" :
    [
        { "Amount" : 4, "AppleID" : "AppleObjectID65"}
    ]
    ...
}
Run Code Online (Sandbox Code Playgroud)

其中OrangeObjectID12_id特定类型 OrangeAppleObjectID65_id字段, 是特定类型 Apple的字段。

有没有可能这两个_id永远是一样的?

Ada*_*m C 5

严格来说,_id字段与您创建的字段一样独特。正如您所发现的, 的默认值_id是,ObjectIDs但您可以使用您希望的任何数据填充该字段。

因此,例如,您可以像我在这个分片示例中所做的那样使用UUID,然后集合之间发生冲突的机会基本上取决于您的生成方法和内容的碰撞机会。这个覆盖的粗略版本也可以在这个要点中看到(我前段时间用来测试的东西)_idGUIDs

就其ObjectIDs本身而言,该主题已被很好地涵盖(例如此处此处),并且可以从您链接的文档中推断出来。基本上,存在冲突的可能性,特别是对于ObjectIDs同一主机在同一秒内以高容量生成的情况,但对于大多数用例而言,这不是问题。

最后,对于跨集合唯一性的任何数据库级别保证,基本上没有。唯一性是由索引强制执行的,索引没有选项可以跨越多个集合,因此唯一性只能在给定的集合内得到保证。