Model Tree Structures with Parent References(父关联)
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
创建索引:
db.categories.createIndex( { parent: 1 } )
通过父节点查询子节点:
db.categories.find( { parent: "Databases" } )
Model Tree Structures with Child References(子关联)
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.findOne( { _id: "Databases" } ).children
创建子节点索引:
db.categories.createIndex( { children: 1 } )
查询包含子节点的所有父节点:
db.categories.find( { children: "MongoDB" } )
Model Tree Structures with an Array of Ancestors(祖先关联)
db.categories.insert( { _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" } )
db.categories.insert( { _id: "dbm", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" } )
db.categories.insert( { _id: "Databases", ancestors: [ "Books", "Programming" ], parent: "Programming" } )
db.categories.insert( { _id: "Languages", ancestors: [ "Books", "Programming" ], parent: "Programming" } )
db.categories.insert( { _id: "Programming", ancestors: [ "Books" ], parent: "Books" } )
db.categories.insert( { _id: "Books", ancestors: [ ], parent: null } )
访问祖先节点:
db.categories.findOne( { _id: "MongoDB" } ).ancestors
创建祖先索引:
db.categories.createIndex( { ancestors: 1 } )
访问包含某个祖先的所有节点:
db.categories.find( { ancestors: "Programming" } )
Model Tree Structures with Materialized Paths(路径关联)
将树节点的访问路径拼接成字符串保存到字段:
db.categories.insert( { _id: "Books", path: null } )
db.categories.insert( { _id: "Programming", path: ",Books," } )
db.categories.insert( { _id: "Databases", path: ",Books,Programming," } )
db.categories.insert( { _id: "Languages", path: ",Books,Programming," } )
db.categories.insert( { _id: "MongoDB", path: ",Books,Programming,Databases," } )
db.categories.insert( { _id: "dbm", path: ",Books,Programming,Databases," } )
该种数据结构可用来根据路径排序:
db.categories.find().sort( { path: 1 } )
查询方式可以使用正则表达式,类似mysql 前后模糊匹配:
db.categories.find( { path: /,Programming,/ } )
也可以使用前缀匹配,即必须以指定字符串开头:
db.categories.find( { path: /^,Books,/ } )
创建索引的方式与其他的一样。
小结:
mongodb树结构详情可以参考官方文档, 在项目中可以根据具体的业务需求来设计集合文档的数据结构,
可以同时包含多钟数据结构,即可以同事父关联、子关联、祖先关联等等。