OPTIONS
翻译或纠错本页面

树结构建模: 子文档引用

概述

MongoDB的数据具有 灵活的模式集合 本身没有对文档结构的规则性校验。 但是你建模时所作的决定会影响到应用程序的性能和数据库的处理能力。参见 数据建模理论 以更多的了解一些关于MongoDB数据建模全面介绍。

这篇文章讲述如何使用在父文档内对子文档进行 引用 的方式来对树结构文档建模。

范式

子文档引用 模式用一个文档来表示树的一个节点。每一个文档除了存储节点的信息,同时也用一个数组来保存该节点所有子节点的id值。

让我们看一下下图所示的树形分类结构:

Tree data model for a sample hierarchy of categories.

Tree data model for a sample hierarchy of categories.

下面是一个使用 子文档引用 的例子。在 children 字段里保存了对所有下一级分类节点的引用。

db.categories.insert( { _id: "MongoDB", children: [] } )
db.categories.insert( { _id: "dbm", children: [] } )
db.categories.insert( { _id: "Databases", children: [ "MongoDB", "dbm" ] } )
db.categories.insert( { _id: "Languages", children: [] } )
db.categories.insert( { _id: "Programming", children: [ "Databases", "Languages" ] } )
db.categories.insert( { _id: "Books", children: [ "Programming" ] } )
  • 查询直接子节点的操作很快很方便:

    db.categories.findOne( { _id: "Databases" } ).children
    
  • 可以对 children 字段建索引,这样可以快速的按子节点查找:

    db.categories.ensureIndex( { children: 1 } )
    
  • 你可以通过 children 字段很快的找到一个节点的父节点以及同级的节点:

    db.categories.find( { children: "MongoDB" } )
    

子文档引用 模式在不要求对分支进行操作的场景下是一个比较不错的树结构建模方案。另外对一个节点多个父节点的图结构也有不错的支持。