假设我有一个聚合管道,它返回以下文档集:
[
{ "_id": 0, "refs": [1, 2] },
{ "_id": 1, "refs": [2, 3] }
]
如何将聚合管道扩展到
- 收集
"refs"
(即[1, 2, 3]
(中的一组不同值 - 返回
_id
与该集合中的值匹配的文档(即_id
为1、2和3的3个文档(
一个选项是向聚合添加4个步骤:
$group
以便收集所有参考- CCD_ 6与CCD_
$lookup
以便从refs
获取文档- 格式
{$group: {_id: 0, refs: {$push: "$refs"}}},
{$project: {
refs: {$reduce: {
input: "$refs",
initialValue: [],
in: {$setUnion: ["$$value", "$$this"]}
}
}
}
},
{$lookup: {
from: "collection",
localField: "refs",
foreignField: "_id",
as: "docs"
}
},
{$unwind: "$docs"},
{$replaceRoot: {"newRoot": "$docs"}}
看看它是如何在操场上工作的例子
有很多方法可以做到这一点。这是另一种方式。
db.collection.aggregate([
{"$unwind": "$refs"},
{
"$group": {
"_id": null,
"refs": {"$addToSet": "$refs"}
}
},
{
"$lookup": {
"from": "collection",
"localField": "refs",
"foreignField": "_id",
"as": "docs"
}
},
{"$unwind": "$docs"},
{"$replaceWith": "$docs"}
])
在mongoplayground.net上试试。