需要对 mongodb 中的数组对象值求和

bil*_*ash 5 mongodb mongodb-query

如果该值存在,我正在尝试计算总价值。但查询并不能 100% 工作。那么有人可以帮我解决这个问题吗?这是我的示例文档。我附上了两份文件。请使用这些文件并找出最佳解决方案文件:1

{
    "_id" : 1"),
    "message_count" : 4,
    "messages" : {
        "data" : [ 
            {
                "id" : "11",
                "saleValue": 1000
            }, 
            {
                "id" : "112",
                "saleValue": 1400
            }, 
            {
                "id" : "22",

            }, 
            {
                "id" : "234",
                "saleValue": 111
            }
        ],

    },
    "createdTime" : ISODate("2018-03-18T10:18:48.000Z")
}
Run Code Online (Sandbox Code Playgroud)

文件:2

 {
        "_id" : 444,
        "message_count" : 4,
        "messages" : {
            "data" : [ 
                {
                    "id" : "444",
                    "saleValue" : 2060
                }, 
                {
                    "id" : "444",
                }, 
                {
                    "id" : 234,
                    "saleValue" : 260
                }, 
                {
                    "id" : "34534",
                }
            ]
        },

        "createdTime" : ISODate("2018-03-18T03:11:50.000Z")
    }
Run Code Online (Sandbox Code Playgroud)

所需输出:

{
   total : 4831
}
Run Code Online (Sandbox Code Playgroud)

我的查询:

db.getCollection('myCollection').aggregate([
    {
        "$group": {
            "_id": "$Id",

            "totalValue": {
                $sum: {
                    $sum: "$messages.data.saleValue"
                }
            }

        }
    }
])
Run Code Online (Sandbox Code Playgroud)

因此,如果可能的话,请帮助我解决这个问题。提前致谢

chr*_*dam 8

它无法正常工作,因为它正在聚合集合中的所有文档;您正在对一个常量进行分组"_id": "tempId",您只需通过添加以下内容来引用正确的键$

db.getCollection('myCollection').aggregate([
    { "$group": {
        "_id": "$tempId",
        "totalValue": { 
            "$sum": { "$sum": "$messages.data.saleValue" } 
        }
    } }
])
Run Code Online (Sandbox Code Playgroud)

它本质上是聚合操作的单阶段管道版本,带有一个额外的字段,该字段在组管道之前保存总和表达式,然后将该字段调用为$sum组中的运算符。

上面的方法是有效的,因为从 MongoDB 3.2+ 开始,在和阶段$sum都可用,并且在阶段中使用时,返回表达式列表的总和。该表达式返回一个数字列表,然后将其用作表达式:$project$group$project$sum"$messages.data.value"[120, 1200]$sum

db.getCollection('myCollection').aggregate([
    { "$project": {
        "values": { "$sum": "$messages.data.value" },
        "tempId": 1,
    } },
    { "$group": {
        "_id": "$tempId",
        "totalValue": { "$sum": "$values" }
    } }
])
Run Code Online (Sandbox Code Playgroud)