我有两个集合,一个是用户集合,另一个是集合集合。在groups
中,文档如下所示:
{
"_id": ObjectId("...")
"members": [ObjectId("..."), ObjectId("..."), ObjectId("...")]
}
在users
集合中,文档如下所示:
{
"_id": ObjectId("...")
"first_name": "...",
"last_name": "...",
"phone": "..."
}
我想要做的是users
集合中的聚合,我将$lookup
阶段添加到管道中,我进入groups
集合并从用户处获取组根据用户文档中的_id
是否在组文档中的members
数组内。
我有以下内容,但我不知道自己该怎么做。
db.users.aggregate([
{
"$match": { "_id": ObjectId("...") }
},
{
"$lookup": {
"from": "groups",
"let": {"_id": "$_id"},
"pipeline": [{"$match": ???}], <- match when $$_id is inside $members
"as": "group"
}
]);
我知道MongoDB中的聚合框架不适用于数组并且有一个$unwind
阶段,但我真的不知道如何组合$unwind
和{ {1}}获得我想要的结果。
我想要的是什么:
$match
我使用MongoDB服务器版本3.7.2
答案 0 :(得分:10)
您可以使用$lookup
和$lookup
管道尝试以下两种方式之一的聚合。
$查找
db.users.aggregate([
{"$match":{"_id":ObjectId(..)}},
{"$lookup":{
"from":"groups",
"localField":"_id",
"foreignField":"members",
"as":"group"
}},
{"$unwind":"$group"},
{"$unwind":"$group.members"},
{"$match":{"group.members":ObjectId(..)}}
])
$ lookup pipeline
db.users.aggregate([
{"$match":{"_id":ObjectId(..)}},
{"$lookup":{
"from":"groups",
"let":{"_id":"$_id"},
"pipeline":[
{"$match":{"$expr":{"$in":["$$_id","$members"]}}},
{"$unwind":"$members"},
{"$match":{"$expr":{"$eq":["$$_id","$members"]}}}
],
"as":"members"
}}
])