具有祖先阵列的模型树结构
在本页面
Overview
MongoDB 中的数据具有弹性模式。 Collections不强制执行document结构。影响数据建模方式的决策会影响应用程序性能和数据库容量。请参阅数据建模概念,以获取有关 MongoDB 中数据建模的完整概述。
本文档描述了一种数据模型,该数据模型使用references表示父节点并使用一个存储所有祖先的数组描述了 MongoDB 文档中的树状结构。
Pattern
祖先数组模式将每个树节点存储在文档中;除树节点外,文档还将节点祖先或路径的 ID 存储在数组中。
考虑以下类别层次结构:
以下示例使用* Array of Ancestors *对树进行建模。除ancestors
字段外,这些文档还在parent
字段中存储对直接父类别的引用:
db.categories.insertMany( [
{ _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" },
{ _id: "dbm", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" },
{ _id: "Databases", ancestors: [ "Books", "Programming" ], parent: "Programming" },
{ _id: "Languages", ancestors: [ "Books", "Programming" ], parent: "Programming" },
{ _id: "Programming", ancestors: [ "Books" ], parent: "Books" },
{ _id: "Books", ancestors: [ ], parent: null }
] )
- 检索节点的祖先或路径的查询是快速而直接的:
db.categories.findOne( { _id: "MongoDB" } ).ancestors
- 您可以在字段
ancestors
上创建索引,以启用祖先节点的快速搜索:
db.categories.createIndex( { ancestors: 1 } )
- 您可以通过字段
ancestors
查询以查找其所有后代:
db.categories.find( { ancestors: "Programming" } )
通过在祖先字段的元素上创建索引,* Array of Ancestors *模式提供了一种快速有效的解决方案,以找到节点的后代和祖先。这使“先祖数组”成为处理子树的好选择。
祖先数组模式比Materialized Paths模式稍慢,但更易于使用。