嵌入式文档在单一文档结构中存储相关数据。文档可以包含具有相关数据的数组和子文档。这些非规范化数据模型允许应用程序在单个数据库操作中检索相关数据。
在以下示例中,contact 和 access 字段是嵌入式文档:
嵌入式数据模型通常被认为是非规范化的,因为经常访问的数据在多个集合中是重复的。
嵌入式数据模型允许应用程序查询同一数据库记录中的相关信息。因此,嵌入具有以下优点:
读取操作性能更佳
在单个数据库操作中检索相关数据的能力
在单次原子写入操作中更新相关数据的能力
嵌入式文档在单一文档结构中存储相关数据。文档可以包含具有相关数据的数组和子文档。这些非规范化数据模型允许应用程序在单个数据库操作中检索相关数据。
用例
在以下场景中使用嵌入式数据模型:
实体之间存在“包含”关系。例如,包含
address的contacts文档。请参见使用嵌入式文档建立一对一关系模型。实体之间存在一对多关系。在这些关系中,“多”或子文档在“一”或父文档的上下文中查看。请参见使用嵌入式文档建立一对多关系模型。
包含大量小文档的集合
如果您的集合包含大量小文档,请考虑嵌入以提高性能。如果您可以按某种逻辑关系对这些小文档群组,并且您经常按此分组检索这些文档,则可以考虑将这些小文档“汇总”为包含一组嵌入式文档的较大大量。
将这些小文档“汇总”为逻辑分组意味着检索一组文档的查询涉及顺序读取和较少的随机磁盘访问。此外,“汇总”文档并将通用字段移动到较大的文档有利于这些字段的索引。通用字段的副本较少,并且相应索引中的关联键条目也较少。有关索引的更多信息,请参阅索引。
但是,如果您经常只需要检索群组内文档的子集,那么“汇总”文档可能无法提供更好的性能。此外,如果较小、单独的文档代表数据的自然模型,则应当保留该模型。
查询嵌入数据
如要查询嵌入文档中的数据,请使用点表示法。有关在数组和嵌入文档中查询数据的示例,请参阅: