使用物化路径构建模型树结构
概述
本页面描述了一个数据模型,该模型通过存储文档之间的完整关系路径来描述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
的子代db.categories.find( { path: /^,Books,/ } ) 要创建对字段
path
的索引,请使用以下调用db.categories.createIndex( { path: 1 } ) 此索引可能取决于查询而提高性能
对于来自根
Books
子树(例如,/^,Books,/
或/^,Books,Programming,/
)的查询,对path
字段的索引可以显著提高查询性能。对于查询不包含从根节点到子树的路径(例如
/,Databases,/
)的子树,或者类似的查询,其中节点可能位于索引字符串的中间,查询必须检查整个索引。对于这些查询,如果索引明显小于整个集合,那么索引可能提供一些性能改进。