Mongodb Найти количество вхождений всех уникальных элементов списка - PullRequest
1 голос
/ 18 июня 2019

У меня есть данные, как показано ниже в mongodb:

{
  "name":["apple", "banana", "oranges", "grapes"]
},
{
  "name":["apple", "banana"]
},
{
  "name":["apple", "oranges"]
},
{
  "name":["oranges", "banana"]
},
{
  "name":["grapes", "banana"]
}

Я хочу объединить и получить результат следующим образом: -

{
  "apple": 3,
  "banana":4,
  "grapes": 3,
  "oranges": 3
}

Я пробовал что-то вроде этого: -

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

В результате получаются точные данные, некоторые уникальные элементы упускаются.Не уверен, что я сделал не так.

1 Ответ

1 голос
/ 18 июня 2019

Вам нужна еще одна $ group , чтобы объединить все агрегаты в один документ и затем запустить на нем $ arrayToObject .Кроме того, вы можете использовать $ replaceRoot для продвижения новой структуры на корневой уровень:

db.collection.aggregate([
    {"$unwind": "$name" },
    { $group: { _id: "$name", count: { $sum: 1 } } },
    { $group: { _id: null, names: { $push: { k: "$_id", v: "$count" } } } },
    { $replaceRoot: { newRoot: { $arrayToObject: "$names" } } }
])

Mongo Playground

...