OPTIONS
翻译或纠错本页面

树结构建模:父文档引用

概述

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

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

范式

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

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

Tree data model for a sample hierarchy of categories.

Tree data model for a sample hierarchy of categories.

下面是一个使用 父文档引用 的例子。在 parent 字段里保存了对上一级分类的引用。

db.categories.insert( { _id: "MongoDB", parent: "Databases" } )
db.categories.insert( { _id: "dbm", parent: "Databases" } )
db.categories.insert( { _id: "Databases", parent: "Programming" } )
db.categories.insert( { _id: "Languages", parent: "Programming" } )
db.categories.insert( { _id: "Programming", parent: "Books" } )
db.categories.insert( { _id: "Books", parent: null } )
  • 查询父节点的操作很快很方便:

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

    db.categories.ensureIndex( { parent: 1 } )
    
  • 这样一来,可以很快的查询一个父节点的所有直接子节点:

    db.categories.find( { parent: "Databases" } )
    

父文档引用 模式是一个比较简单的树结构建模方案。它的缺点是在需要读取某个分支的时候需要执行多个查询。