使用嵌套集合构建模型树结构
概述
本文档描述了一个数据模型,该模型描述了一个类似于树的结构,以牺牲树的易变性为代价来优化发现子树。
模式
嵌套集模式将树中的每个节点标识为树的一次往返遍历中的停靠点。应用会两次访问树中的每个节点;第一次在初始行程中,第二次在返回行程中。《嵌套集》模式在每个文档中存储每个树节点;除了树节点外,文档还存储节点的父节点ID、节点在left
字段的初始停靠点和其在right
字段中的返回停靠点。left
考虑以下类别的层次结构
以下示例使用嵌套集来模拟树
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 } } );
嵌套集模式为查找子树提供了快速有效的解决方案,但修改树结构效率较低。因此,此模式最适合静态树,这些树不经常改变。