Агрегация MongoDB, подсчет каждого элемента в массиве и группировка по элементам

#mongodb #aggregation-framework

#mongodb #агрегация-фреймворк

Вопрос:

здесь у меня есть массив повторяющихся элементов, подобных этому

 [
 'gg',
 'bb',
 'dd',
 'cc',
 'll',
 'aa',
 'cc',
 'gg',
 'bb',
 'dd',
 'cc',
 'bb',
 'dd',
 'll',
 'aa',
]
  

и то, что я готов вернуть, выглядит следующим образом

 {
 'gg': 2,
 'bb': 3,
 'dd': 3,
 'cc': 2,
 'll': 2,
 'aa': 2,
}
  

Можно ли это сделать с помощью агрегации MongoDB??? Ценю любую помощь

Ответ №1:

Используйте $unwind и $group в качестве этапов конвейерной обработки агрегации:
Запрос:

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

Результат:

 {
    "_id": "ll",
    "count": 2
  },
  {
    "_id": "gg",
    "count": 2
  },
  {
    "_id": "bb",
    "count": 3
  },
  {
    "_id": "cc",
    "count": 3
  },
  {
    "_id": "aa",
    "count": 2
  },
  {
    "_id": "dd",
    "count": 3
  }
  

Ответ №2:

Это также работает действительно хорошо…

 db.users.aggregate([
    {
        $group: {
            _id: "$email",
            count: { $sum: 1 }
        }
    },
    {
        $match: {
            count: { $gt: 1 }
        }
    }
])
  

Вывод:

 { "_id" : "a@gmail.com", "count" : 2 }
{ "_id" : "b@gmail.com", "count" : 2 }
{ "_id" : "c@gmaiL.com", "count" : 8 }
{ "_id" : "d@gmail.com", "count" : 2 }
{ "_id" : "e@gmail.com", "count" : 2 }
{ "_id" : "f@gmail.com", "count" : 2 }