mongodb数据结构-树

树结构

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树结构详情可以参考官方文档, 在项目中可以根据具体的业务需求来设计集合文档的数据结构,
可以同时包含多钟数据结构,即可以同事父关联、子关联、祖先关联等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹二木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值