欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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进行正则匹配)。