【问题标题】:What is the most efficient way to store a tree data structure in MongoDB?在 MongoDB 中存储树数据结构的最有效方法是什么?
【发布时间】:2021-04-14 06:10:39
【问题描述】:

我在想最简单的事情是一个平面列表:

{
  id: ObjectId()
  parentId:  ObjectId()
  value: ‘foo’,
}

只有一个大集合。要查找节点的子节点,只需搜索列表并找到 parentId 等于当前节点 id 的所有实例。 id/parentId 上的索引。

这对于写入可能会更快,但读取可能会变得非常可怕。 而且我们的读比写要多得多!

MongoDB 有某种内置的树形数据结构: https://docs.mongodb.com/manual/applications/data-models-tree-structures/

但我想知道这与我提出的那种扁平化列表有何不同。

【问题讨论】:

    标签: node.js mongodb tree


    【解决方案1】:

    如果你在id 上定义一个索引,在parentId 上定义一个索引,那么找到一个节点的子节点应该非常快。

    为什么你认为这会很可怕?


    更新: 最坏的情况是 O(log N),但重要的是要注意 Mongo 使用的存储桶大小是 8192 (source)。这意味着这次乘以一个非常小的常数,这意味着 MongoDB 操作可以非常快。

    【讨论】:

    • 不会那么糟糕。但是每次你需要找到一个节点的子节点时,你都必须查看同一个集合并重新阅读它。我认为最坏的情况是 log(n) 时间来读取带有索引的整个内容。
    • @AlexanderMills 是的,但由于树桶的大小,它们真的很快。我更新了我的答案。
    【解决方案2】:

    这在现实世界的应用程序中很棘手。 MongoDB推荐五种方式:

    具有父引用的模型树结构: 呈现一个数据模型,通过在“子”节点中存储对“父”节点的引用,以树状结构组织文档。

    具有子引用的模型树结构: 呈现一个数据模型,通过在“父”节点中存储对“子”节点的引用,以树状结构组织文档。

    具有祖先数组的模型树结构: 呈现一个数据模型,该模型通过存储对“父”节点的引用和存储所有祖先的数组来以树状结构组织文档。

    具有物化路径的模型树结构: 呈现一个数据模型,该模型通过存储文档之间的完整关系路径以树状结构组织文档。除了树节点之外,每个文档都将节点的祖先或路径的 _id 存储为字符串。

    具有嵌套集的模型树结构: 呈现一个使用嵌套集模式以树状结构组织文档的数据模型。这会以树的可变性为代价优化子树的发现。

    找到完整的解释here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2017-01-12
      • 2011-07-12
      • 2021-10-22
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多