我在 MongoDB 中使用以下聚合管道来遍历双向图:
{ $match: { from: "some_root" } },
{
$graphLookup: {
from: "connections",
startWith: "$to",
connectFromField: "to",
connectToField: "from",
as: "children",
depthField: "depth",
maxDepth: 100
},
}
connection
使用我的数据结构,这会导致零个或多个输出文档,这些文档在其字段中都具有相同的文档数组children
。我想对这些connection
文档进行进一步处理,但避免处理重复项。
我如何才能仅选择第一个文档的children
数组并将它们提升为输出文档,以便在管道的下一步中进行处理?
添加以下阶段可以得到我想要的结果,但是该$graphLookup
阶段的每个输出文档都会有重复的文档:
{ $unwind: { path: "$children" } },
{ $replaceRoot: { newRoot: "$children" } }
对我来说,这似乎是语义上正确的方法,并且它之前只缺少一个对“ $select
”children
第一个文档的字段进行处理的阶段。
我知道一个$group
阶段可能能够过滤掉重复项,但这感觉像是对一个简单问题的复杂解决方案(即,如果您可以避免出现这些重复项,为什么要过滤掉重复项)。
澄清伪示例
该$graphLookup
阶段的结果是:
{
_id: 1,
children: [
{ _id: 10 },
{ _id: 11 }
]
},
{
_id: 2,
children: [
{ _id: 10 },
{ _id: 11 }
]
}
我希望从中提取一组children
并将它们提升为文档,以便用于管道的后续步骤,即作为输入文档:
{ _id: 10 },
{ _id: 11 }
根据要求对评论进行书面答复。
在该阶段之前应用该
$limit
阶段来限制 1 个文档,因为帖子所有者只需要从上一阶段返回的第一个文档的数组$unwind
中的对象。children