Non funziona correttamente perché sta aggregando tutti i documenti della collezione; stai raggruppando su una costante "_id": "tempId"
, devi solo fare riferimento alla chiave corretta aggiungendo il $
come:
db.getCollection('myCollection').aggregate([
{ "$group": {
"_id": "$tempId",
"totalValue": {
"$sum": { "$sum": "$messages.data.value" }
}
} }
])
che in sostanza è una versione della pipeline a stadio singolo di un'operazione aggregata con un campo aggiuntivo che contiene l'espressione sum prima della pipeline di gruppo, quindi chiamando quel campo come $sum
operatore nel gruppo.
Quanto sopra funziona poiché $sum
da MongoDB 3.2+ è disponibile sia in $project
e $group
fasi e quando utilizzato nel $project
stage, $sum
restituisce la somma dell'elenco delle espressioni. L'espressione "$messages.data.value"
restituisce un elenco di numeri [120, 1200]
che vengono quindi utilizzati come $sum
espressione:
db.getCollection('myCollection').aggregate([
{ "$project": {
"values": { "$sum": "$messages.data.value" },
"tempId": 1,
} },
{ "$group": {
"_id": "$tempId",
"totalValue": { "$sum": "$values" }
} }
])