MongoDB中嵌套文档的求和

16

我试图对文档数组中的一些值求和,但没有成功。

这是文档:

db.Cuentas.find().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”所有“Monto”的总和。在这个例子中是154000

使用聚合函数,我使用了以下代码:

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

但我总是得到同样的结果。

{ "result" : [{ "_id" : null, "suma" : 0 }], "ok" : 1 }

我做错了什么?

P.D. 已经看过 这个这个


1
我相信你想要先展开Egresos数组,然后按空值分组并求和。 - Sammaye
@Sammaye 添加了 {"$unwind": $Egresos },然后我得到了 ReferenceError: Egresos 未定义 - Mario Cares Cabezas
在最新版本中,您可以使用以下代码来简化单个文档中数组值的求和。db.Cuentas.aggregate([ {$match: {"Usuario": "MarioCares"} }, {$project: { "suma": {$sum: "$Egresos.Monto" }}} ]) - s7vr
3个回答

29

正如Sammaye所指出的那样,你需要$unwind Egresos 数组来复制每个数组元素以便你可以在每个元素上进行$sum

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

11

你也可以用这种方法。不需要分组,只需投影你的字段。

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

你能给一个例子或代码片段吗? - Aabid
对不起 @Aabid。它没有成功,因为我有一个稍微不同的情况,假设 Egresos 也是同一项目阶段中的一个变量... 但在这个问题的情况下它确实有效。 - Daga Arihant
@DagaArihant,这个对你提出的问题有用吗? - Aabid
对不起,我的情况不同,我没有提出问题。 - Daga Arihant

0

自mongoDB 3.4版本以来,您可以使用$reduce来对数组项求和:

db.collection.aggregate([
  {
    $match: {Usuario: "MarioCares"}
  },
  {
    $project: {
      suma: {
        $reduce: {
          input: "$Egresos",
          initialValue: 0,
          in: {$add: ["$$value", "$$this.Monto"]}
        }
      }
    }
  }
])

示例游乐场


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接