mongodb树形结构

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

猜你喜欢

转载自kibear.iteye.com/blog/2394878