具有实体化路径的模型树结构
在本页面
Overview
MongoDB 中的数据具有弹性模式。 Collections不强制执行document结构。影响数据建模方式的决策会影响应用程序性能和数据库容量。请参阅数据建模概念,以获取有关 MongoDB 中数据建模的完整概述。
本文档介绍了一种数据模型,该数据模型通过存储文档之间的完整关系路径来描述 MongoDB 文档中的树状结构。
Pattern
“路径化”模式将每个树节点存储在文档中;除树节点外,文档还以字符串的形式存储节点祖先或路径的 ID。尽管路径化模式需要使用字符串和正则表达式的其他步骤,但该模式还提供了更大的灵 Active,例如通过部分路径查找节点。
考虑以下类别层次结构:
下面的示例使用* Materialized Paths *对树进行建模,并将路径存储在字段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,/
),或者对于子树的类似查询(节点可能位于索引字符串的中间),查询必须检查整个指数。
- 对于在查询中未提供从根路径开始的子树查询(例如
对于这些查询,索引可能会提供一些性能改进*,如果*索引显着小于整个集合。