具有祖先阵列的模型树结构

在本页面

Overview

MongoDB 中的数据具有弹性模式Collections不强制执行document结构。影响数据建模方式的决策会影响应用程序性能和数据库容量。请参阅数据建模概念,以获取有关 MongoDB 中数据建模的完整概述。

本文档描述了一种数据模型,该数据模型使用references表示父节点并使用一个存储所有祖先的数组描述了 MongoDB 文档中的树状结构。

Pattern

祖先数组模式将每个树节点存储在文档中;除树节点外,文档还将节点祖先或路径的 ID 存储在数组中。

考虑以下类别层次结构:

类别 samples 层次结构的树数据模型。

以下示例使用* 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模式稍慢,但更易于使用。