MongoDB 按多个字段聚合分组

MongoDB aggregate group by multiple fields

示例文档

{
    "user_id": "1",
    "key": "key1"
},
{
    "user_id": "1",
    "key": "key2"
},
{
    "user_id": "2",
    "key": "key1"
},
{
    "user_id": "2",
    "key": "key1"
},
{
    "user_id": "3",
    "key": "key2"
},
{
    "user_id": "4",
    "key": "key1"
}

如果我只想按 key 字段分组,我可以使用下面的查询。

db.test.aggregate([
    {
        $group: {
            _id: {
                "key": $key"
            },
            count: {
                $sum: 1
            }
        }
    },
    {
        $sort: {"count":-1}
    },
])

它将按 key 分组并按 key 的计数排序。

但是,从上述文档中可以看出,存在单个用户具有重复密钥的情况。

因此,我不得不以user_id字段为目标进行分组

预期数据:

{"key": "key1", "count": 3}
{"key": "key2", "count": 2}

如何对多个字段进行分组?

谢谢。

  • $group by key 并构造数组 os unique user_id by $addToSet operator
  • $size 获取 user_id
  • 中的总元素
db.test.aggregate([
  {
    $group: {
      _id: "$key",
      count: { $addToSet: "$user_id" }
    }
  },
  { $addFields: { count: { $size: "$count" } } },
  { $sort: { count: -1 } }
])

Playground


第二个pos理解$group阶段的合理方式,

  • $group 两个字段 keyuser_id
  • $group by the only key and get a sum of the count
db.test.aggregate([
  {
    $group: {
      _id: {
        key: "$key",
        user_id: "$user_id"
      }
    }
  },
  {
    $group: {
      _id: "$_id.key",
      count: { $sum: 1 }
    }
  },
  { $sort: { count: -1 } }
])

Playground