MongoDB $graphLookup 获取子级所有级别的深层嵌套结果

标签 mongodb aggregation-framework tree-structure

https://www.slideshare.net/mongodb/webinar-working-with-graph-data-in-mongodb 中所述, 幻灯片 50 可以在 View 上使用 $graphLookup 以获得嵌套格式的 2 层深度树结构。

我有一个 MongoDB 集合,其中树节点作为文档,格式如下:

{ "_id" : { "$oid" : "5b1a952361c6fa3418a15660" }, 
"nodeId" : 23978995, 
"name" : "settings", 
"type" : "Node",
"parentId" : [ 23978893, 23979072, 23979081 ] }

我创建了一个 View ,如下所示:

db.createView("treeView", "node", [
{
 $graphLookup: {
    from: "node",
    startWith: "$nodeId",
    connectFromField: "nodeId",
    connectToField: "parentId",
    maxDepth: 0,
    as: "children"
 }
}
]);

我执行图形查找,如下所示:

db.node.aggregate([ 
{ $match: {"nodeId": 23978786 } },
{
 $graphLookup: {
    from: "treeView",
    startWith: "$nodeId",
    connectFromField: "nodeId",
    connectToField: "parentId",
    maxDepth: 0,
    as: "children"
 }
}
]);

我的问题是如何获得整个层次结构、所有级别的深度?

最佳答案

不幸的是,您无法获得嵌套格式的完整深度。使用 View 是一种解决方法,可让您执行该操作,但您需要为所需的每个嵌入级别创建一个新 View 。 相反,我会考虑在不提供深度的情况下执行 graphLookup,从根级别开始,在单个查询中获取所有层次结构,然后再在应用程序级别计算树。

这看起来像这样:

db.node.aggregate([
    { $match: {
        parentId: null
    }},
    { $graphLookup: {
        from: "node",
        startWith: "$nodeId",
        connectFromField: "nodeId",
        connectToField: "parentId",
        depthField: "depth",
        as: "children"
    }}
]);

这应该让您一次性获取整个层次结构,因此接下来,您需要根据“children”数组中的信息计算应用程序中的树。

关于MongoDB $graphLookup 获取子级所有级别的深层嵌套结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50767930/

相关文章:

java - 在java中使用多线程更新mongodb

arrays - 如何在MongoDb集合的数组字段中投影元素?

node.js - Mongodb 无法启动 - 原因 : errno:111 Connection refused

mongodb - 使用 MongoDB 中的聚合框架按特定嵌套字段值对文档进行计数

node.js - 在带有 MongoDB 聚合的字典数组上使用 $mergeObjects

java - 删除树结构中没有特定子节点的节点

sql - 针对树结构的优化SQL

node.js - 如何在nodejs中发送更新的值?

c# - 使用聚合从 mongodb 中的 order by 和 group by 联合选择

javascript - 无法读取属性 "match"(nestedSortable)