具有嵌套集的模型树结构
在本页面
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 } } );
“嵌套集”模式为查找子树提供了一种快速而有效的解决方案,但对于修改树结构却效率不高。因此,此模式最适合不变的静态树。