Mongodb Aggregate query pour additionner toutes les valeurs en fonction des champs à l'intérieur des objets d'un tableau

Dec 11 2020

J'ai une collection datadans MongoDB qui ressemble à ceci -

document 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
        }
    ]
}

& bientôt..

Je souhaite agréger le valchamp en fonction de la titlevaleur. La sortie devrait ressembler à -

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

Comment y parvenir? Merci d'avance.

Réponses

2 turivishal Dec 11 2020 at 12:51
  • $unwinddéconstruire le metadatatableau
  • $grpuppar titleet faire la somme deval
  • $grouppar null, convertir un tableau en objet à partir de la clé et de la valeur par $arrayToObject, et fusionner des objets en utilisant$mergeObjects
db.collection.aggregate([
  { $unwind: "$metadata" }, { $group: {
      _id: "$metadata.title", sum: { $sum: "$metadata.val" } } }, { $group: {
      _id: null,
      metadata: {
        $mergeObjects: { $arrayToObject: [
            [{ k: "$_id", v: "$sum" }]
          ]
        }
      }
    }
  }
])

Terrain de jeux

1 ray Dec 11 2020 at 12:31

Vous pouvez d'abord $ dérouler le metadatatableau. Ensuite, utilisez $ group et$cond to $additionnez vos valeurs.

Voici le terrain de jeu mongo pour votre référence.