Подсчет вхождений элементов в массиве с помощью механизма агрегации mongodb - PullRequest
1 голос
/ 24 февраля 2020

Я работаю в проекте с express и mongodb (я использую mon goose), и у меня есть коллекция со следующей структурой:

[
{
    "_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 или мне следует использовать что-то другое?

Спасибо!

1 Ответ

2 голосов
/ 24 февраля 2020

$ group - это способ добиться этого, но вы должны $ $ раскрутить свой массив раньше.

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

Примечание: первый этап $ project не является обязательным, и он даст точно такой же результат без этого. Тем не менее, я настоятельно рекомендую оставить его на месте, так как разматывание / группировка могут быть дорогостоящими операциями. (он будет производить один документ на элемент массива).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...