Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

使用物化路径对树结构进行建模

在此页面上

  • 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,/)或类似的子树查询,其中节点可能位于索引字符串的中间,查询必须检查整个索引。

      对于这些查询,如果索引明显小于整个集合,索引可能会在一定程度上提高性能。

后退

祖先数组

在此页面上