假设我有以下部分文件
{
"groups": [
{
"color": "Red",
"key": 1,
},
{
"color": "Blue",
"key": 2,
},
{
"color": "Yellow",
"key": 3,
},
"members": [
{
"name": "Deen",
"groupKey": 1,
},
{
"name": "Joe",
"groupKey": 2,
},
{
"name": "Michel",
"groupKey": 1,
},
{
"name": "Simon",
"groupKey": 3,
},
]
}
我想根据群组颜色获得匹配的成员。例如,对于Red,我会得到Deen和Michel,对于Blue,我会得到Joe,而对于Yellow,我会得到Simon。
在一个聚合中可以做到吗? 我需要通过查询其颜色来获取组密钥,然后通过查询groupKey来获取成员。
答案 0 :(得分:2)
您可以在3.4中尝试以下聚合。
您可以在groups数组中找到匹配颜色的索引,并输出匹配组,然后输出$filter
以过滤匹配“groupKey”的所有成员。
注意,当您总是找到匹配的颜色时,此解决方案有效,否则$indexOfArray
将返回-1,您将无法获得预期的结果。为了解决这个问题,您可以在获取组doc之前添加$cond
运算符来检查索引。
db.col.aggregate([
{"$addFields":{
"members":{
"$let":{
"vars":{
"group":{
"$arrayElemAt":["$groups",{"$indexOfArray":["$groups.color","Red"]}]
}
},
"in":{
"$filter":{"input":"$members","cond":{"$eq":["$$this.groupKey","$$group.key"]}}
}
}
}
}}
])