进入MongoDB中文手册(4.2版本)目录
1 概述
此页面描述了一种数据模型,该数据模型是存储文档之间的完整关系路径的树形结构文档。
2 模式
物化路径模式存储文档中的每个树节点; 除树节点外,文档还以字符串的形式存储节点祖先或路径的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,/),或者对于类似的子树查询(其中节点可能位于索引字符串的中间),查询必须检查整个索引。
对于这些查询,如果索引明显小于整个集合,则索引可能会提供一些性能的提高。