Consulta agregada Mongodb para somar todos os valores com base em campos dentro de objetos em um Array

Dec 11 2020

Eu tenho uma coleção datano MongoDB que se parece com isto -

documento 1-

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

document2 -

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

& em breve..

Desejo agregar o valcampo com base no titlevalor. A saída deve ser semelhante a -

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

Como faço para conseguir isso? Desde já, obrigado.

Respostas

2 turivishal Dec 11 2020 at 12:51
  • $unwinddesconstruir metadatamatriz
  • $grpuppor titlee fazer a soma deval
  • $grouppor nulo, converte array em objeto de chave e valor por $arrayToObject, e mescla objetos usando$mergeObjects
db.collection.aggregate([
  { $unwind: "$metadata" }, { $group: {
      _id: "$metadata.title", sum: { $sum: "$metadata.val" } } }, { $group: {
      _id: null,
      metadata: {
        $mergeObjects: { $arrayToObject: [
            [{ k: "$_id", v: "$sum" }]
          ]
        }
      }
    }
  }
])

Parque infantil

1 ray Dec 11 2020 at 12:31

Você pode primeiro $ desenrolar a metadatamatriz. Então use $ group e$cond to $some seus valores.

Aqui está o playground mongo para sua referência.