MongoDB按值分组并计算出现次数

3
我正在尝试计算集合中特定值出现的次数。
{
  _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分别出现的次数,并返回计数结果。

我想要的输出结果:

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

你好,能否添加示例文档和期望输出? - NeNaD
@NeNaD 请再次检查问题。 - user16463210
3个回答

6
这是聚合管道中$group阶段的典型用例。您可以像这样执行:
  • $group - 按field2将所有文档分组
  • $sum - 计算每个field2值的文档数量
db.collection.aggregate([
  {
    "$group": {
      "_id": "$field2",
      "count": {
        "$sum": 1
      }
    }
  }
])

Working example


我在发布问题之前也尝试了同样的方法,但J.F.上面提供的解决方案是正确的(也是我想要的解决方案)。谢谢你回答NeNaD。 - user16463210

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

Example here


嗨,我认为这可以通过$group阶段比3个单独的$facet更有效地完成。 :D - NeNaD

0
利用$arrayToObject运算符和最终的$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

{{链接1:Mongo Playground}}



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接