使用 mongodb 聚合框架计算数组中的项目出现次数

Count item occurrences in an array with mongodb aggregation framework

我在一个使用 express 和 mongodb 的项目中工作(我使用的是 mongoose),我有一个具有以下结构的集合:

[
{
    "_id": "5e4a39f01ab49e48d4db5b9c",
    "last": {
        "winningNumbers": {
            "list": [
                66,
                71,
                62,
                50,
                29,
                67,
                74,
                43,
                22,
                1,
                11,
                3,
                80,
                17,
                57,
                53,
                30,
                19,
                76,
                40
            ],
            "bonus": [
                40
            ]
        }
    }
},
{
    "_id": "5e4a3b1c1ab49e48d4db5cb8",
    "last": {
        "winningNumbers": {
            "list": [
                71,
                46,
                79,
                60,
                1,
                14,
                19,
                73,
                34,
                55,
                5,
                65,
                12,
                47,
                16,
                62,
                51,
                53,
                3,
                45
            ],
            "bonus": [
                45
            ]
        }
    }
}

]

我尝试使用 mongodb 聚合框架来计算整个集合中 last.winningNumber.list 数组中每个数字的出现次数,但我没有实现。

我想要如下所示的输出:

{
    "occurrences": [
        {number:1,count:3},
        {number:2,count:8},
        {number:12,count:15},
        ...
        {number:78,count:55},
    ]
}

有什么方法可以使用 $group 实现吗?还是我应该使用不同的东西?

谢谢!

$group 是实现这个的方法,但是你必须先 $unwind 你的数组。

db.collection.aggregate([
  {
    $project: {
      "last.winningNumbers.list": 1
    }
  },
  {
    $unwind: "$last.winningNumbers.list"
  },
  {
    $group: {
      _id: "$last.winningNumbers.list",
      count: {
        $sum: 1
      }
    }
  }
])

注意:第一个 $project 阶段不是强制性的,没有它会产生完全相同的结果。 但是,我强烈建议保留它,因为展开/分组可能是昂贵的操作。 (它将为每个数组元素生成一个文档)。