如何在MongoDB中聚合内部数组的值?

时间:2016-01-24 18:59:34

标签: mongodb mongodb-query aggregation-framework

我的文档结构:

{"id"   : 1
    "apps" : [
        {
            "name" : "APP1",
            "date_added" : Timestamp(1453470861, 1),
            "power" : [
                {
                    "date" : Timestamp(1453470960, 1),
                    "amount" : 30.3739953125
                },
                {
                    "date" : Timestamp(1453470960, 1),
                    "amount" : 30.3739953125
                },
                {
                    "date" : Timestamp(1453470960, 1),
                    "amount" : 30.3739953125
                },
                {
                    "date" : Timestamp(1453470967, 1),
                    "amount" : 30.30951765625
                }
        }]
}

我在文档中有多个应用,但只发布了一个。

我想按apps.name进行分组,并获取每个应用的power.amount总和。 这是我提出的代码:

db.x.aggregate([{$match:{id:1}},{$unwind:"$apps"},{$group:{_id:"$apps.name",total:{$sum:"$apps.power.amount"}}}])

但是我得到了这个结果:

{ "_id" : "APP1", "total" : 0 }

有人可以告诉我是什么原因导致查询给出零作为答案?

2 个答案:

答案 0 :(得分:1)

尝试在计算之前解除“权力”。

这是我的建议:

db.x.aggregate([{$match:{id:1}},{$unwind:"$apps"},{$unwind:"$apps.power"},{$group:{_id:"$apps.name",total:{$sum:"$apps.power.amount"}}}])

答案 1 :(得分:0)

MongoDB版本3.2或更新的解决方案:

$match阶段之后,下一阶段是$project阶段,您基本上使用$map返回"数量"的2d数组。从那里你需要使用$unwind运算符对2d数组进行非规范化。管道中的最后一个阶段是另一个$project阶段,您可以使用从{3.2}开始的$group$project阶段中提供的$sum累加器运算符 计算"金额"的总和。

db.collection.aggregate(
    [
        { "$match": { "id": 1 } }, 
        { "$project": { 
            "amounts": { 
                "$map": { 
                    "input": "$apps",
                    "as": "app", 
                    "in": { 
                        "$map":  { 
                            "input": "$$app.power", 
                            "as": "p", 
                            "in": "$$p.amount" 
                        } 
                    } 
                } 
            }
        }}, 
        { "$unwind": "$amounts" }, 
        { "$project": { "total": { "$sum": "$amounts" } } }  
    ]
)

哪个收益率:

{ "_id" : ObjectId("56a54de01964fd33b12ccaab"), "total" : 121.43150359375 }