关于_id和嵌套对象

时间:2011-11-08 21:33:37

标签: mongodb

如果有人能回答我的新手MongoDB问题,我将不胜感激。

  1. 如果用户指定的_id字段不是唯一的,将会产生什么后果 在DB或集合?在什么范围内,唯一性是必要的 (嵌套对象的范围是什么)?

  2. 是否可以为集合中的整个文档更改(替换)_id(及其类型)?

  3. 当我作为json对象存储(参见下面的A)或作为带有_id(B)的嵌入文档时,嵌套对象之间的区别(在DB引擎处理中)是什么?

    A){book: _id:.. chapters[{json object has not _id},{}]}

    B){book: _id:.. chapters[{_id:... },{}]}

    是否存在_id和索引或更深层次的差异?

  4. 如何将“只是json对象”(不带_id)转换为带有_id的嵌入式文档?

1 个答案:

答案 0 :(得分:2)

  

如果用户分配的_id字段不是唯一的,将会产生什么后果   在DB或集合?在什么范围内,唯一性是真正必要的(和   嵌套对象的范围是什么?)

在任何数据集中,唯一性都非常重要,因为您需要一种通过某种身份识别数据的方法。独特的ID是关键。

定义唯一索引时非常重要。当您尝试在唯一索引中添加重复键时,它将被拧紧。

  

是否可以为整体更改(替换)_id(及其类型)   集合中的文件?

不能直接使用,您需要将文档数据复制到临时集合,然后使用新的ID将它们重新插入到原始集合中。

  

嵌套之间有什么区别(在DB引擎的处理中)   我作为json对象存储时的对象(见下文 - A)或as   带有_id(B)的嵌入式文档?

嵌入式对象是mongodb原生支持的对象,引用对象将由代码主要由ODM手动处理(如ruby Mongoid)

由于您提出了不同之处,因此嵌入式文档被视为文档中的另一个字段,因此您可以对其进行查询,您可以将其编入索引并作为文档的一部分返回。

但引用文档完全是一个单独的文档。您不能直接从父文档中查询它,因此索引。相反,您必须编写应用程序逻辑来存储ID并从应用程序手动查询它们。

  

如何将“只是json对象”(不带_id)转换为嵌入式   带有_id的文件?

你的假设是错误的。嵌入式文档确实有ID。它会在您创建时自动生成。

修改

我的假设在这方面是错误的。 Mongodb不会自动为嵌入文档生成ID。但是像Mongoid这样的ODM也会为嵌入式文档生成id。