具有嵌套集的模型树结构

在本页面

Overview

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

本文档描述了一个数据模型,该数据模型描述了类似树的结构,该结构以牺牲树的可变性为代价来优化发现子树的过程。

Pattern

“嵌套集”模式将树中的每个节点标识为树的往返遍历中的停止点。应用程序访问树中的每个节点两次;首先是在初次旅行期间,然后是回程。 “嵌套集”模式将每个树节点存储在文档中;除树节点外,文档还将节点的父节点的 ID,节点的初始停止点存储在left字段中,并将其返回停止点存储在right字段中。

考虑以下类别层次结构:

分层数据的示例。数字标识在树的往返遍历期间在节点处的停靠点。

以下示例使用嵌套集对树进行建模:

db.categories.insertMany( [
   { _id: "Books", parent: 0, left: 1, right: 12 },
   { _id: "Programming", parent: "Books", left: 2, right: 11 },
   { _id: "Languages", parent: "Programming", left: 3, right: 4 },
   { _id: "Databases", parent: "Programming", left: 5, right: 10 },
   { _id: "MongoDB", parent: "Databases", left: 6, right: 7 },
   { _id: "dbm", parent: "Databases", left: 8, right: 9 }
] )

您可以查询以检索节点的后代:

var databaseCategory = db.categories.findOne( { _id: "Databases" } );
db.categories.find( { left: { $gt: databaseCategory.left }, right: { $lt: databaseCategory.right } } );

“嵌套集”模式为查找子树提供了一种快速而有效的解决方案,但对于修改树结构却效率不高。因此,此模式最适合不变的静态树。