本文为NoSQL数据模型设计系列的一部分。
此模式每个节点是一个文档,并且节点保存祖先节点的路径字符串。尽管此模式需要处理字符串和正则表达式等额外工作,但它可以提供更大的灵活性比如按照部分路径查询。
以下面分类层级为例
![](https://img.haomeiwen.com/i14121537/f027865cb6daa73b.png)
创建文档
db.categories.insertMany( [
{ _id: "Books", path: null },
{ _id: "Programming", path: ",Books," },
{ _id: "Databases", path: ",Books,Programming," },
{ _id: "Languages", path: ",Books,Programming," },
{ _id: "MongoDB", path: ",Books,Programming,Databases," },
{ _id: "dbm", path: ",Books,Programming,Databases," }
] )
按照路径排序获得整棵树
db.categories.find().sort( { path: 1 } )
采用正则表达式获得指定节点的子孙
db.categories.find( { path: /,Programming,/ } )
在path字段上创建索引
db.categories.createIndex( { path: 1 } )
如果查询提供从根节点开始的路径例如/^,Books,/ 或/^,Books,Programming,/,此索引能够快速匹配结果。
如果查询提供中间路径,需要扫描整个索引返回结果。但如果索引比collection小很多,还是能提高性能。
完整内容请查看NoSQL数据模型设计系列
网友评论