使用物化路径对树结构进行建模
Overview
本页描述的数据模型通过存储文档之间的完整关系路径来描述 MongoDB 文档中的树状结构。
模式
物化路径模式将每个树节点存储在文档中;除了树节点之外,文档还将节点的祖先或路径的 id 存储为字符串。尽管物化路径模式需要额外的步骤来处理字符串和正则表达式,但该模式在处理路径时更加灵活,例如通过部分路径查找节点。
以以下类别层次结构为例:
以下示例使用物化路径对树进行建模,并将路径存储在字段 path
中;路径字符串使用逗号 ,
作为分隔符:
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," } ] )
您可以通过查询来检索整个树,按字段
path
排序:db.categories.find().sort( { path: 1 } ) 您可以在
path
字段上使用正则表达式查找Programming
的子级:db.categories.find( { path: /,Programming,/ } ) 您还可以检索
Books
的后代,Books
也位于层次结构的最顶层:db.categories.find( { path: /^,Books,/ } ) 要在字段
path
上创建索引,请使用以下调用:db.categories.createIndex( { path: 1 } ) 该索引可能会提高性能,具体取决于查询:
对于在根
Books
子树(例如/^,Books,/
或/^,Books,Programming,/
)中执行的查询,在path
字段上构建索引可显著提高查询性能。对于未在查询中提供从根到子树的路径的查询(例如
/,Databases,/
)或类似的子树查询,其中节点可能位于索引字符串的中间,查询必须检查整个索引。对于这些查询,如果索引明显小于整个集合,索引可能会在一定程度上提高性能。