传递MongoDB聚合中的值

时间:2018-01-11 14:21:52

标签: mongodb mongodb-query aggregation-framework

假设我有以下部分文件

{ 
  "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来获取成员。

1 个答案:

答案 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"]}}
        }
      }
    }
  }}
])