Mongo子文档数组的_id

16

我希望在Mongo数组的对象中添加一个_id属性。

这样做是否是良好的实践? 是否存在索引相关的问题?


2
这个问题有点模糊。你能提供更多细节吗? - Eric
http://stackoverflow.com/questions/8245538/mongodb-id-cannot-be-an-array - 42n4
4
我认为该链接与这个问题无关。 - Sammaye
1个回答

23

我希望在mongo数组中为对象添加一个_id属性。

我猜想:

{
    g: [
        { _id: ObjectId(), property: '' },
        // next
    ]
}

这是一个关于问题结构的类型。

这是一个好的实践方法吗?

通常不是。 _id 是实体的唯一标识符。因此,如果您要在子文档对象中添加 _id,则可能没有很好地规范化数据,这可能是模式设计中基本缺陷的迹象。

子文档旨在包含该文档的重复数据,例如用户的地址或其他信息。

话虽如此,添加 _id 并不总是一件坏事情。以我刚才提到的地址为例。想象一下,如果您要拥有一个购物车系统,并且(由于某种原因)您没有将地址复制到订单文档中,那么您将使用一个 _id 或其他标识符来获取该子文档。

此外,您还必须考虑链接文档。如果该 _id 描述了另一个文档,并且属性是与该链接文档相关的自定义属性,则也可以使用。

索引有问题吗?

ObjectId 仍然相当大,所以在考虑使用较小、不太唯一的 id 或根本不使用 _id 作为子文档时,这是需要考虑的问题。

对于索引,它与文档本身上的标准 _id 字段没有什么不同,字段上的唯一索引应该适用于整个集合(具体情况取决于场景,请测试您的查询)。

注意:MongoDB 不会为子文档添加 _id


@aioobe 我认为在这种情况下是指规范化,这是一个非常古老的答案,但我相信我指的是他没有很好地分离实体,这将是规范化。 - Sammaye
如果我在子文档上创建一个mongodb对象_id,那么它是否自动成为整个集合中唯一的_id? - Saitama
在90%的情况下,是的,但时间片段可能会发生冲突,不过MongoDB在一段时间前做了一些修复。 - Sammaye
90% 真的很可怕... :s - Saitama
2
我想补充一下,另一方面,Mongoose会自动为每个子文档添加一个 _id - deb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接