【问题标题】:Count item occurrences in an array with mongodb aggregation framework使用 mongodb 聚合框架计算数组中的项目出现次数
【发布时间】:2020-02-23 21:26:50
【问题描述】:

我正在使用 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 来实现,或者我应该使用不同的方法吗?

谢谢!

【问题讨论】:

    标签: mongodb express group-by aggregation-framework find-occurrences


    【解决方案1】:

    $group 是实现此目的的方法,但您必须先 $unwind 您的数组。

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

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

    【讨论】:

    • 谢谢!我已经用同样的方法弄了它。这对我有很大帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-12-21
    • 2013-12-25
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多