如何在嵌入式数组文档中使用图形查找聚合

S.p*_*til 8 mongodb aggregation-framework

这是我的NetworkInfo集合的示例文档。

{
"_id" : ObjectId("5a37595bd2d9ce37f86d612e"),
"edgeList" : [ 
    {
        "networkSource" : {
            "sourceId" : "pump1"
        },
        "networkRelationship" : {},
        "networkTarget" : {
            "targetId" : "chiller1",
            "parentId" : "pump1"
        }
    }, 
    {
        "networkSource" : {
            "sourceId" : "chiller1"
        },
        "networkRelationship" : {},
        "networkTarget" : {
            "targetId" : "secondaryPump1",
            "parentId" : "chiller1"
        }
    }, 
    {
        "networkSource" : {
            "sourceId" : "secondaryPump1"
        },
        "networkRelationship" : {},
        "networkTarget" : {
            "targetId" : "ahu1",
            "parentId" : "secondaryPump1"
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

}

我尝试使用以下代码为上述文档创建图形查找:

泵1->冷却器1->次级泵1-> ahu1

db.getCollection("NetworkInfo").aggregate([ {$project:{_id:0}},{ $unwind : "$edgeList" }, { $out : "FlattenedNetwork" } ])
db.FlattenedNetwork.aggregate( [
{
  $graphLookup: {
     from: "FlattenedNetwork",
     startWith: "$edgeList.networkTarget.parentId",
     connectFromField: "edgeList.networkTarget.parentId",
     connectToField: "edgeList.networkTarget.targetId",
     as: "reportingHierarchy"
  }}])
Run Code Online (Sandbox Code Playgroud)

这很好。但是,我希望避免使用临时集合“ FlattenedNetwork”。我尝试添加多个聚合函数,但没有帮助。

Mar*_*ara 5

我做了几次尝试,但没有找到真正的解决方案。我也观看了网络研讨会,但未涉及此案例。因此,我决定对这个问题悬赏,希望其他人可以分享比我更好的解决方案。然而,唯一的出路(在我看来)是使用一个视图,我声明如下:

db.createView("unwounded_docs", "NetworkInfo", [ 
        {
            $unwind : "$edgeList"
        }, 
        {
            $replaceRoot : {
                newRoot : "$edgeList"
            }
        }, 
        {
            $project : {
                "networkTarget" : 1
            }
        },
        {
            $addFields: {
                "_id": "$networkTarget.targetId"
            }
        }
    ]
);
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,我删除了所有无用的字段。该视图将具有以下输出:

{
    "networkTarget" : {
        "targetId" : "chiller1",
        "parentId" : "pump1"
    },
    "_id" : "chiller1"
},
{
    "networkTarget" : {
        "targetId" : "secondaryPump1",
        "parentId" : "chiller1"
    },
    "_id" : "secondaryPump1"
},
{
    "networkTarget" : {
        "targetId" : "ahu1",
        "parentId" : "secondaryPump1"
    },
    "_id" : "ahu1"
}
Run Code Online (Sandbox Code Playgroud)

由于您可以引用from舞台字段中的视图$graphLookup,因此这就是管道(至少比以前短):

db.unwounded_docs.aggregate( [
{
  $graphLookup: {
     from: "unwounded_docs",
     startWith: "$networkTarget.parentId",
     connectFromField: "networkTarget.parentId",
     connectToField: "networkTarget.targetId",
     as: "reportingHierarchy"
  }
}])
Run Code Online (Sandbox Code Playgroud)