如何获得总和的总和和总和,这也是mongoDB中项目的总和
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获得总和的总和和总和,这也是mongoDB中项目的总和相关的知识,希望对你有一定的参考价值。
我有类似的mongo文件如下:
{"client" : "ashwini",
"data" : [
{
.....
"ac" : [
{
"cord" : [
5.0,
0.0
],
"power" : 10.0,on:true
},
{
"cord" : [
52.0,
0.0
],
"power" : 22.0,on:true
},
{
"cord" : [
85.0,
0.0
],
"power" : 50.0,on:false
},
{
"cord" : [
5.0,
50.0
],
"power" : 30.0,on:true
}
],
"fan" : [
{
"cord" : [
10.0,
20.0
],
"power" : 50.0,on:true
},
{
"cord" : [
60.0,
20.0
],
"power" : 10.0,on:true
},
{
"cord" : [
85.0,
20.0
],
"power" : 40.0,on:false
},
{
"cord" : [
10.0,
70.0
],
"power" : 10.0,on:true
}
],
"light" : [
{
"cord" : [
30.0,
0.0
],
"power" : 34.0,on:true
},
{
"cord" : [
66.0,
0.0
],
"power" : 10.0,on:true
},
{
"cord" : [
82.0,
90.0
],
"power" : 69.0,on:true
},
{
"cord" : [
20.0,
50.0
],
"power" : 70.0,on:true
}
],
"name" : "Palm Meadows",
"floor" : -1.0
},
......
]
}
我想要查询的输出如下:
{
agr:{
lights:10,
ac:10,
fan:20
},
split:[
{
name:"Palm Meadows",
power:40,
location:"Mahadevpura",
lights:10,
ac:10,
fan:20
},
....
],
}
其中第一个agr是光/交流/风扇区域中所有功率的总和,用于客户端“ashwini”,它们打开并分开,具有单独的光/交流/风扇总和,按名称和位置单独显示
我按照以下方式进行了第一次试验
db.getCollection('property').aggregate([
{$match:{"client":"ashwini"}},
{
$group:{
_id:"$_id",
values:{
$addToSet:{
name:"$data.name",
floor:"$data.floor",
location:"$data.location",
lights:{$sum:"$data.lights.power"},
fan:{$sum:"$data.fan.power"},
ac:{$sum:"$data.ac.power"}
}
}
}
}
])
其输出如下
我不确定如何达到我的要求
答案
您可以在3.4中使用以下聚合。
第一部分是计算每个位置的总和值。
第二部分是汇总所有地点的总和值。
对于每个($map
)data
行,$filter
数据文档,其中on
字段为真,然后$sum
ing power
值为每个请求的字段(内部$let
)。
外部$let
表达式计算每个元素的power
值,它是所请求字段的总和以及聚合请求字段值name
和location
作为split
阶段内的$project
字段。
将所有请求的字段值聚合在所有位置,作为aggr
阶段内的$addFields
字段,该字段也保留现有值。
db.getCollection('property').aggregate([
{"$match":{"client":"ashwini"}},
{"$project":{
"_id":0,
"split":{
"$map":{
"input":"$data",
"as":"d",
"in":{
"$let":{
"vars":{
"ac":{
"$sum":{
"$let":{
"vars":{"acm":{"$filter":{"input":"$$d.ac","as":"ac","cond":"$$ac.on"}}},
"in":"$$acm.power"
}
}
},
"fan":{
"$sum":{
"$let":{
"vars":{"fanm":{"$filter":{"input":"$$d.fan","as":"fan","cond":"$$fan.on"}}},
"in":"$$fanm.power"
}
}
},
"light":{
"$sum":{
"$let":{
"vars":{"lightm":{"$filter":{"input":"$$d.light","as":"light","cond":"$$light.on"}}},
"in":"$$lightm.power"
}
}
}
},
"in":{
"name":"$$d.name",
"location":"$$d.location",
"power":{"$sum":["$$ac","$$fan","$$light"]},
"ac":"$$ac",
"fan":"$$fan",
"light":"$$light"
}
}
}
}
}
}},
{"$addFields":{
"aggr":{
"ac":{"$sum":"$split.ac"},
"fan":{"$sum":"$split.fan"},
"light":{"$sum":"$split.light"},
"power":{"$sum":"split.power"}
}
}}
])
使用以下查询输出位置和名称的计算值。
$unwind
数据数组后跟$group
的位置和名称。
$reduce
遍历分组数据以汇总所有请求的字段值。
qidxswpoi由_id推送数组中的数据值,用于计算所有位置的值。
$group
以上是关于如何获得总和的总和和总和,这也是mongoDB中项目的总和的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 mongodb 和 mongoose 从帖子模型中计算整体帖子活动(喜欢、不喜欢、评论)和用户模型中的参考总和