Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongodb$graphLookup构建层次结构_Javascript_Mongodb_Mongoose_Graphlookup - Fatal编程技术网

Javascript Mongodb$graphLookup构建层次结构

Javascript Mongodb$graphLookup构建层次结构,javascript,mongodb,mongoose,graphlookup,Javascript,Mongodb,Mongoose,Graphlookup,我有一个来自mongodb$graphLookup聚合的输出: db.getCollection('projects').aggregate([ { $lookup: { from: "projects", localField: "_id", foreignField: "parent", as: "childrens" } } ]) 我需要从javascript中的输出构建层次结构,或者如果可能的话,直接从查询

我有一个来自mongodb
$graphLookup
聚合的输出:

db.getCollection('projects').aggregate([
    {
    $lookup: {
      from: "projects",
      localField: "_id",
      foreignField: "parent",
       as: "childrens"
     }
 }
])

我需要从javascript中的输出构建层次结构,或者如果可能的话,直接从查询中构建层次结构,因此最终输出应该如下所示:

{
    "_id" : "1",
    "name" : "Project1",
    "parent" : null,
    "childrens" : [ 
        {
            "_id" : "3",
            "name" : "ProjectForId1",
            "parent" : "1",
            "childrens" : [ 
                {
                    "_id" : "6",
                    "name" : "ProjectForId3",
                    "parent" : "3"
                }, 
                {
                    "_id" : "7",
                    "name" : "ProjectForId3",
                    "parent" : "3"
                }
            ]
        }
    ]
} 
此外,如果有人有勇气在另一种情况下提供帮助,在这种情况下,将通过过滤id创建层次结构:

例如:对于
\u id=“1”
而言,输出将与上述相同,但如果
\u id
3
,则最终输出应如下所示:

{
    "_id" : "3",
    "name" : "ProjectForId1",
    "parent" : "1",
    "childrens" : [ 
        {
            "_id" : "6",
            "name" : "ProjectForId3",
            "parent" : "3"
        }, 
        {
            "_id" : "7",
            "name" : "ProjectForId3",
            "parent" : "3"
        }
    ]
}

下面的答案和我过去的答案差不多,所以你们可以得到详细的解释


最后一个阶段应该是过滤,这样你可以在这里获得任何深度的数据。

下面的解决方案与我过去的一个答案大致相同,因此你可以得到详细的解释


最后一个阶段应该是过滤,因此您可以在此处获得任何深度级别的数据。

感谢您的回答,但不幸的是,您预期的结果并不正确。输出是
{u-id:“1”,“name:”Project1”,“parent:”null,“childrens:[{{u-id:”3”,“name:”ProjectForId1”,“parent:”1“}]}
,正如您可以看到的那样,{u-id的“6”和“7”没有显示为“3”的children@2009年,我假设您发布的JSON是一个输入,可能您需要将查找放在前面it@mikl请在我的帖子中找到我的解释,因为这里的平台告诉我,我超过了407个字符。。。感谢you@durduliu2009粘贴源数据时,这会发生很大变化。幸运的是,它与我以前的一个答案非常相似,因此您可以查看我修改过的帖子。@mikl首先我要感谢您的帮助,我非常感谢您最后的答案,但不幸的是,此聚合仍然存在一个小问题。。。我已经用一个新文档更新了我的评论,该文档的_id=8,parent=6,这个新文档“_id”:8似乎出现在“_id”6和7中,但它应该只出现在“_id”=6中。因此,上面更新了新的完整示例。再次感谢您的努力,如果最后一个问题您能帮助我,我将非常高兴听到您的回答,但不幸的是,您预期的结果并不好。输出是
{u-id:“1”,“name:”Project1”,“parent:”null,“childrens:[{{u-id:”3”,“name:”ProjectForId1”,“parent:”1“}]}
,正如您可以看到的那样,{u-id的“6”和“7”没有显示为“3”的children@2009年,我假设您发布的JSON是一个输入,可能您需要将查找放在前面it@mikl请在我的帖子中找到我的解释,因为这里的平台告诉我,我超过了407个字符。。。感谢you@durduliu2009粘贴源数据时,这会发生很大变化。幸运的是,它与我以前的一个答案非常相似,因此您可以查看我修改过的帖子。@mikl首先我要感谢您的帮助,我非常感谢您最后的答案,但不幸的是,此聚合仍然存在一个小问题。。。我已经用一个新文档更新了我的评论,该文档的_id=8,parent=6,这个新文档“_id”:8似乎出现在“_id”6和7中,但它应该只出现在“_id”=6中。因此,上面更新了新的完整示例。再次感谢你的努力,如果你能帮我解决最后一个问题,我将非常高兴
{
    "_id" : "3",
    "name" : "ProjectForId1",
    "parent" : "1",
    "childrens" : [ 
        {
            "_id" : "6",
            "name" : "ProjectForId3",
            "parent" : "3"
        }, 
        {
            "_id" : "7",
            "name" : "ProjectForId3",
            "parent" : "3"
        }
    ]
}
db.projects.aggregate([
    {
        $graphLookup: {
            from: "projects",
            startWith: "$_id",
            connectFromField: "_id",
            connectToField: "parent",
            as: "children",
            maxDepth: 4,
            depthField: "level"
        }
    },
    {
        $unwind: "$children"
    },
    {
        $sort: { "children.level": -1 }
    },
    {
        $group: {
            _id: "$_id",
            children: { $push: "$children" }
        }
    },
    {
        $addFields: {
            children: {
                $reduce: {
                    input: "$children",
                    initialValue: {
                        currentLevel: -1,
                        currentLevelProjects: [],
                        previousLevelProjects: []
                    },
                    in: {
                        $let: {
                            vars: {
                                prev: { 
                                    $cond: [ 
                                        { $eq: [ "$$value.currentLevel", "$$this.level" ] }, 
                                        "$$value.previousLevelProjects", 
                                        "$$value.currentLevelProjects" 
                                    ] 
                                },
                                current: { 
                                    $cond: [ 
                                        { $eq: [ "$$value.currentLevel", "$$this.level" ] }, 
                                        "$$value.currentLevelProjects", 
                                        [] 
                                    ] 
                                }
                            },
                            in: {
                                currentLevel: "$$this.level",
                                previousLevelProjects: "$$prev",
                                currentLevelProjects: {
                                    $concatArrays: [
                                        "$$current", 
                                        [
                                            { $mergeObjects: [ 
                                                "$$this", 
                                                { children: { $filter: { input: "$$prev", as: "e", cond: { $eq: [ "$$e.parent", "$$this._id"  ] } } } } 
                                            ] }
                                        ]
                                    ]
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $addFields: { children: "$children.currentLevelProjects" }
    },
    {
        $match: {
            _id: "1"
        }
    }
])