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

时间:2018-03-26 12:14:14

标签: 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")
}

文件: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")
    }

需要输出:

{
   total : 4831
}

我的查询:

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

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

        }
    }
])

所以请尽可能帮我解决这个问题。提前致谢

4 个答案:

答案 0 :(得分:1)

它无法正常工作,因为它正在汇总集合中的所有文档;您正在对常量"_id": "tempId"进行分组,只需将$添加为:{/ p>即可引用正确的密钥

db.getCollection('myCollection').aggregate([
    { "$group": {
        "_id": "$tempId",
        "totalValue": { 
            "$sum": { "$sum": "$messages.data.value" } 
        }
    } }
])

本质上是聚合操作的单阶段管道版本,带有一个额外字段,用于在组管道之前保存sum表达式,然后将该字段作为组中的$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" }
    } }
])

答案 1 :(得分:1)

db.getCollection('myCollection').aggregate([
   {
     $unwind: "$messages.data",
     $group: {
        "_id": "tempId",
        "totalValue": { $sum: "$messages.data.value" }
     }
   }
])

$unwind

答案 2 :(得分:0)

您可以在$unwind之前添加$group,这样您就可以解构数据数组,然后就可以正确分组:

db.myCollection.aggregate([
{
    "$unwind": "$messages.data"
},
{
    "$group": {
        "_id": "tempId",
        "totalValue": {
            $sum: {
                $sum: "$messages.data.value"
            }
        }
    }
}
])

输出:

{ "_id" : "tempId", "totalValue" : 1320 }

答案 3 :(得分:0)

根据上述问题的描述,作为解决方案,请尝试执行以下聚合查询

db.myCollection.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $unwind: {
                path: '$messages.data'
            }
        },

        // Stage 2
        {
            $group: {
                _id: {
                    pageId: '$pageId'
                },
                total: {
                    $sum: '$messages.data.saleValue'
                }
            }
        },

        // Stage 3
        {
            $project: {
                pageId: '$_id.pageId',
                total: 1,
                _id: 0
            }
        }

    ]


);