mongodb树形结构
程序员文章站
2022-03-01 19:57:21
...
在mongodb中有多种方式来存储属性结构的数据。
1 通过子文档关联父文档
{ "_id": 1, "name": "子节点", "parents": ["父节点1","父节点2"] }
2 通过父节点关联子节点
{ "_id": 1, "name": "父节点", "childs": ["子节点1","子节点2"] }
3 通过外部collection来做关联
{ "_id": 1, "parent": 2, "child": 3 }
这三种方式方式都有个问题,当查询子孙节点或者祖先节点的时候,都需要递归查询。在官档中看到另一种方式,就是通过存储祖先的路径,然后用正则来做查询,可以很方便的查询某个节点的子孙节点或者祖先节点,不用递归查询。
4 通过存储祖先的路径
{ "_id": 1, "name": "子节点", "path": "父节点1,父节点2,父节点3," }
假如查询父节点1的子孙节点,查询就可以使用正则查询:
{ "path": /父节点1,/ }
查祖先节点就更简单了,直接拿出path里面所有的数据,就是祖先节点了。
但是这种结构有一个问题,就是如果只查一层,即查子节点或者父节点就不好弄了,于是就用第3种方式来做这种子父的查询。
5 通过存储祖先和父节点
{ "_id": 1, "name": "子节点", "parents": ["父节点1", "父节点2"], "path": "父节点1,父节点2," }
这种方式可以很方便的查找某个节点的所有子节点(通过parents等于这个父节点就行),以及某个节点的所有子孙节点(通过path进行正则匹配)。