我的文档结构:
{"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 }
有人可以告诉我是什么原因导致查询给出零作为答案?
答案 0 :(得分:1)
尝试在计算之前解除“权力”。
这是我的建议:
db.x.aggregate([{$match:{id:1}},{$unwind:"$apps"},{$unwind:"$apps.power"},{$group:{_id:"$apps.name",total:{$sum:"$apps.power.amount"}}}])
答案 1 :(得分:0)
在$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 }