本文为NoSQL数据模型设计系列的一部分。
此模式采用双向遍历方式标注树上的每个节点。每个节点是一个文档,并且节点将出程遍历的序号保存为左序号字段,将回程遍历的序号保存为右序号字段。
以下图为例
![](https://img.haomeiwen.com/i14121537/5d318d0d4761fd8f.png)
创建文档
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 } } );
此模式提供一个快速高效的方式获取节点的子树,但是修改树结构时需要额外的操作更新左右序号,故此,此模式最好使用在静态树上。
完整内容请查看NoSQL数据模型设计系列
网友评论