我有一个任意的树结构。
示例数据结构:
root
|--node1
| |--node2
| | |--leaf1
| |
| |--leaf2
|
|--node3
|--leaf3
每个节点和叶子都有 2 个属性:id
和name
。
重要查询:
1.:
给出了一个叶子 ID。查询应返回从根到该叶的整个路径,以及所有节点id
和name
属性。
如果返回值是节点的排序数组,或者它是节点嵌套的对象,这并不重要。
示例:如果给出id
of leaf2
,则查询应返回:root(id, name), node1(id, name), leaf2(id, name)
。
2.:
给定任何节点id
:获取整个(子)树。在这里检索每个节点都有一个children
数组的单个对象会很好。
想法、试验和错误:
1.:
首先,我尝试将树简单地建模为单个 JSON 文档,但随后查询将变得不可能:无法找出叶子的嵌套级别。如果我知道id
s 从根到叶的整个路径,我就不得不使用具有多个位置运算符的投影,而目前 MongoDB 不支持。此外,无法索引叶子ids
,因为嵌套可以是无限的。
2.:
下一个想法是使用平面数据设计,其中每个节点都有一个包含节点祖先的数组ids
:
{
id: ...,
name: ...,
ancestors: [ rootId, node1Id, ... ]
}
这样,我必须进行 2 次查询,以获取从根到某个节点或叶的整个路径,这非常好。
问题:
如果我选择数据模型2.
:如何获得整个树或子树?
获取所有后代很容易:find({ancestors:"myStartingNodeId"})
. 但是这些当然不会被排序或嵌套。
有没有办法使用聚合框架或完全不同的数据模型来解决这个问题?
谢谢!