Mongodb Aggregate query для суммирования всех значений на основе полей внутри объектов в массиве

Dec 11 2020

У меня есть коллекция dataв MongoDB, которая выглядит так:

документ 1-

{
    metadata:[
        {
            "title": "High",
            "val": 12
        },
        {
            "title": "Medium",
            "val": 15
        },
        {
            "title": "Low",
            "val": 2
        }
    ]
}

документ2 -

{
    metadata:[
        {
            "title": "High",
            "val": 10
        },
        {
            "title": "Medium",
            "val": 12
        },
        {
            "title": "Low",
            "val": 20
        }
    ]
}

& скоро..

Я хочу агрегировать valполе на основе titleзначения. Результат должен выглядеть так -

{
    "High": 22,
    "Medium": 27,
    "Low": 22
}

Как мне этого добиться? Заранее спасибо.

Ответы

2 turivishal Dec 11 2020 at 12:51
  • $unwindдеконструировать metadataмассив
  • $grpupпо titleи сделать суммуval
  • $groupпо нулю, преобразовать массив в объект из ключа и значения по $arrayToObjectи объединить объекты, используя$mergeObjects
db.collection.aggregate([
  { $unwind: "$metadata" }, { $group: {
      _id: "$metadata.title", sum: { $sum: "$metadata.val" } } }, { $group: {
      _id: null,
      metadata: {
        $mergeObjects: { $arrayToObject: [
            [{ k: "$_id", v: "$sum" }]
          ]
        }
      }
    }
  }
])

Игровая площадка

1 ray Dec 11 2020 at 12:31

Вы можете сначала $ развернуть metadataмассив. Затем используйте $ group и$cond to $суммируйте свои ценности.

Вот игровая площадка монго для вашей справки.