【问题标题】:MongoDB aggregate group by multiple fieldsMongoDB按多个字段聚合组
【发布时间】:2021-08-30 04:53:38
【问题描述】:

示例文档

{
    "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}

如何使用多个字段进行分组?

谢谢。

【问题讨论】:

  • 你能再澄清一点吗?您想为每个“键”计算唯一用户“user_id”吗?

标签: mongodb aggregation-framework pymongo


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

Playground


了解$group阶段的第二种可能方式,

  • $group 两个字段 keyuser_id
  • $group 按唯一键得到计数的总和
db.test.aggregate([
  {
    $group: {
      _id: {
        key: "$key",
        user_id: "$user_id"
      }
    }
  },
  {
    $group: {
      _id: "$_id.key",
      count: { $sum: 1 }
    }
  },
  { $sort: { count: -1 } }
])

Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2013-03-19
    • 1970-01-01
    • 2019-03-23
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多