gpt4 book ai didi

MongoDB Tree Model : Get all ancestors, 获取所有后代

转载 作者:IT老高 更新时间:2023-10-28 13:28:06 26 4
gpt4 key购买 nike

我有一个任意的树结构。

示例数据结构:

root
|--node1
| |--node2
| | |--leaf1
| |
| |--leaf2
|
|--node3
|--leaf3

每个节点和叶子都有 2 个属性:idname


重要查询:

1.: 给出一个叶子 id。查询应返回从根到该叶的整个路径,以及所有节点的 idname 属性。

返回值是节点的排序数组还是节点嵌套的对象并不重要。

示例:如果给定leaf2id,查询应返回:root(id, name), node1 (id, name), leaf2(id, name).


2.: 给定任意节点id:获取整个(子)树。这里最好检索一个对象,其中每个节点都有一个 children 数组。


想法、尝试和错误:

1.: 首先,我尝试将树简单地建模为单个 JSON 文档,但随后查询将变得不可能:无法找出叶子的嵌套级别。如果我知道 id 从根到叶子的整个路径,我就不得不使用具有多个位置运算符的投影,而目前 MongoDB 不支持。此外,无法对叶子 ids 进行索引,因为嵌套可以是无限的。

2.: 下一个想法是使用平面数据设计,其中每个节点都有一个数组,其中包含节点的祖先 ids:

{
id: ...,
name: ...,
ancestors: [ rootId, node1Id, ... ]
}

这样我必须做 2 次查询,以获得从根到某个节点或叶的整个路径,这非常好。

问题:

如果我选择数据模型2.:我怎样才能得到整棵树,或者一个子树?

获取所有后代很容易:find({ancestors:"myStartingNodeId"})。但这些当然不会排序或嵌套。

有没有办法使用聚合框架或完全不同的数据模型来解决这个问题?

谢谢!

最佳答案

MongoDB不是图数据库,不提供图遍历操作,所以没有直接的解决方案。

您可以使用您在第 2 点中描述的数据模型。(具有祖先列表的节点)、查询 find({ancestors:"myStartingNodeId"}) 并在您的应用程序中对结果进行排序/嵌套代码。

另一种可能性是使用 _id(或其他一些字段)表示完整路径的数据模型,例如 'root.node1.node2'。然后图形查询可以转换为子字符串查询,并且可以通过这个 _id 排序来实现正确的排序(我希望)。


更新:顺便说一句。 MongoDB 文档中描述了一些树结构模式:Model Tree Structures in MongoDB

关于MongoDB Tree Model : Get all ancestors, 获取所有后代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31631775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com