文档菜单
文档首页
/
MongoDB 手册
/ / /

使用物化路径构建模型树结构

本页内容

  • 概述
  • 模式

本页面描述了一个数据模型,该模型通过存储文档之间的完整关系路径来描述MongoDB文档中的树形结构。

物化路径模式将每个树节点存储在文档中;除了树节点外,文档还将节点祖先或路径的id作为字符串存储。尽管物化路径模式需要使用字符串和正则表达式进行额外的工作步骤,但该模式也提供了更多处理路径的灵活性,例如通过部分路径查找节点。

考虑以下类别层次结构

Tree data model for a sample hierarchy of categories.

以下示例使用物化路径来建模树,在字段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,/)的子树,或者类似的查询,其中节点可能位于索引字符串的中间,查询必须检查整个索引。

      对于这些查询,如果索引明显小于整个集合,那么索引可能提供一些性能改进。

返回

祖先数组

本页内容