在嵌套文档MongoDB中求和

Mar*_*zas 10 sum mongodb aggregation-framework

我试图在一系列文档中总结一些值,没有运气.

这是文件

db.Cuentas.find().漂亮的()

{
    "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(....)
}
Run Code Online (Sandbox Code Playgroud)

因此,我需要"Eguos"中所有"Monto"的总和为"Usuario":"MarioCares".在这个例子154000

使用聚合我使用:

db.Cuentas.aggregate(
    [
        { $match: {"Usuario": "MarioCares"} },
        { $group: 
            {
                _id: null,
                "suma": { $sum: "$Egresos.Monto" }
            }
        }
    ]
)
Run Code Online (Sandbox Code Playgroud)

但我总是得到

{ "result" : [{ "_id" : null, "suma" : 0 }], "ok" : 1 }
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么 ?

PD已经看到了这个这个

Joh*_*yHK 19

正如Sammaye指出的那样,你需要$unwindEgresos数组中复制匹配的doc每个数组元素,这样你就可以$sum覆盖每个元素:

db.Cuentas.aggregate([
    {$match: {"Usuario": "MarioCares"} }, 
    {$unwind: '$Egresos'}, 
    {$group: {
        _id: null, 
        "suma": {$sum: "$Egresos.Monto" }
    }}
])
Run Code Online (Sandbox Code Playgroud)


Aab*_*bid 8

你也可以这样做.不需要分组只是投影你的字段.

db.Cuentas.aggregate([
    { $match: { "Usuario": "MarioCares" } },
    {
        $project: {
            'MontoSum': { $sum: "$Egresos.Monto" }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)