Mongodb 按值分组并计算出现的次数

Mongodb group by values and count the number of occurence

我正在尝试计算某个特定值在集合中出现了多少次。

{
  _id:1,
  field1: value,
  field2: A,
}

{
  _id:2,
  field1: value,
  field2: A,
}

{
  _id:3,
  field1: value,
  field2: C,
}

{
  _id:4,
  field1: value,
  field2: B,
}

我想要的是计算 A 出现的次数、B 出现的次数和 C 出现的次数 return 计数。

我想要的输出

{
  A: 2,
  B: 1,
  C: 1,
}

您可以像这样在聚合管道中使用 $facet

  • $facet 创建“三种方式”,其中每种方式都按所需键(A、B 或 C)过滤值。
  • 然后在$project阶段就可以得到匹配值的$size
db.collection.aggregate([
  {
    "$facet": {
      "first": [
        {
          "$match": {
            "field2": "A"
          }
        }
      ],
      "second": [
        {
          "$match": {
            "field2": "B"
          }
        }
      ],
      "third": [
        {
          "$match": {
            "field2": "C"
          }
        }
      ]
    }
  },
  {
    "$project": {
      "A": {
        "$size": "$first"
      },
      "B": {
        "$size": "$second"
      },
      "C": {
        "$size": "$third"
      }
    }
  }
])

示例here

这是聚合管道中 $group 阶段的典型用例。你可以这样做:

  • $group - 按 field2
  • 对所有文档进行分组
  • $sum - 统计field2
  • 每个值的文档数
db.collection.aggregate([
  {
    "$group": {
      "_id": "$field2",
      "count": {
        "$sum": 1
      }
    }
  }
])

Working example

利用 $arrayToObject operator and a final $replaceWith 管道获得所需的结果。您需要 运行 以下聚合管道:

db.collection.aggregate([
    { $group: {
        _id: { $toUpper: '$field2' },
        count: { $sum: 1 }
    } },
    { $group: {
        _id: null,
        counts: { 
            $push: { k: '$_id', v: '$count' }
        }
    } },
    { $replaceWith: { $arrayToObject: '$counts' } }    
])

Mongo Playground