MongoDB 聚合组按 ID 然后编码

MongoDB aggregation group by ID then code

我有这个 collection:

[{
    "_id": "5c378eecd11e570240a9b0ac",
    "userID": "1",
    "isActive": "Active",
    "areaCode": "A-1",
    "__v": 0
},
{
    "_id": "5c378eecd11e570240a9b0bb",
    "userID": "1",
    "isActive": "Active",
    "areaCode": "A-2",
    "__v": 0
},
{
    "_id": "5c378eecd11e570240a9b0c5",
    "userID": "2",
    "isActive": "Active",
    "areaCode": "A-1",
    "__v": 0
}]

需要帮助按用户 ID 对结果进行分组,然后使用聚合对区号进行分组,但我没有得到所需的输出。这是我尝试过的:

        AreaCodes.aggregate([
            {
                '$match': { '$and': [
                        { 'isActive': 'Active' },
                        { 'userID': { '$exists': true } }
                    ]
                }
            },
            {
                '$group': {
                    '_id': {
                        'userID': '$userID'
                    },
                    'entries': {
                        '$push': {
                            'areaCode': '$areaCode'
                        }
                    }
                }
            },
            {
                '$group': {
                    '_id': '$_id.userID',
                    'areaCodes': {
                        '$push': {
                            'areaCode': '$entries'
                        }
                    }
                }
            },
            {
                '$project': {
                    '_id': 0,
                    'userID': '$_id',
                    'areaCodes': '$areaCodes'
                }
            }
        ])

其中returns以下:

[
    {
        "userID": "1",
        "areaCodes": [
            {
                "areaCode": [
                    {
                        "areaCode": "A-1"
                    },
                    {
                        "areaCode": "A-2"
                    }
                ]
            }
        ]
    },
    {
        "userID": "2",
        "areaCodes": [
            {
                "areaCode": [
                    {
                        "areaCode": "A-1"
                    }
                ]
            }
        ]
    }
]

我想要的输出是删除多余的 areaCode objects 并将它们分组到每个用户的数组中,例如:

[
    {
        "userID": "1",
        "areaCodes": ["A-1", "A-2"]
    },
    {
        "userID": "2",
        "areaCodes": ["A-1"]
    }
]

如何实现这种格式?谢谢。

怎么样:

db.collection.aggregate([
  {
    $match: {
      $and: [{ "isActive": "Active" }, {"userID": {"$exists": true}}]
    }
  },
  {
    $group: {
      _id: '$userID',
      areaCodes: {$addToSet: "$areaCode"}
    }
  },
  {
    $project: {
      _id: 0,
      userID: "$_id",
      areaCodes: 1
    }
  }
])

正如您在 this playgeound example 上看到的那样。

如果您只想要匹配的区域代码,您可以简单地使用 $addToSet