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”。我尝试添加多个聚合函数,但没有帮助。
我做了几次尝试,但没有找到真正的解决方案。我也观看了网络研讨会,但未涉及此案例。因此,我决定对这个问题悬赏,希望其他人可以分享比我更好的解决方案。然而,唯一的出路(在我看来)是使用一个视图,我声明如下:
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)
归档时间: |
|
查看次数: |
577 次 |
最近记录: |