Сумма вложенных документов в MongoDB
Я пытаюсь суммировать некоторые значения в массиве документов, но безуспешно.
Это документ
db.Cuentas.находить.)(pretty ()
{
"Agno": "2013",
"Egresos": [
{
"Fecha": "28-01-2013",
"Monto": 150000,
"Detalle": "Pago Nokia Lumia a @josellop"
},
{
"Fecha": "29-01-2013",
"Monto": 4000,
"Detalle": "Cine, Pelicula fome"
}
],
"Ingresos": [],
"Mes": "Enero",
"Monto": 450000,
"Usuario": "MarioCares"
"_id": ObjectId(....)
}
Итак, мне нужна сумма всех "Монто" в "Egresos" для "Usuario": "MarioCares". В этом примере 154000
используя агрегацию, я использую это:
db.Cuentas.aggregate(
[
{ $match: {"Usuario": "MarioCares"} },
{ $group:
{
_id: null,
"suma": { $sum: "$Egresos.Monto" }
}
}
]
)
но я всегда получаю
{ "result" : [{ "_id" : null, "suma" : 0 }], "ok" : 1 }
что я делаю не так ?
2 ответов
как указал Саммайе, вам нужно $unwind
на Egresos
массив для дублирования сопоставленного документа на элемент массива, чтобы вы могли $sum
над каждым элементом:
db.Cuentas.aggregate([
{$match: {"Usuario": "MarioCares"} },
{$unwind: '$Egresos'},
{$group: {
_id: null,
"suma": {$sum: "$Egresos.Monto" }
}}
])
Я знаю, что немного поздно, но вы также можете сделать это таким образом. не нужно группировать, просто проецируйте свои поля.
db.Cuentas.aggregate([
{ $match: { "Usuario": "MarioCares" } },
{
$poject: {
'MontoSum': { $sum: "$Egresos.Monto" }
}
}
])