我有类似如下的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"}
}
}
}
}
])
给出如下输出
我不确定如何达到我的要求
答案 0 :(得分:1)
您可以在3.4中使用以下聚合。
第一部分是计算每个地点的总和值。
第二部分是汇总所有地点的总和值。
对于每个{$map
)data
行,$filter
on
字段为真的数据文档,然后$sum
power
每个请求字段的值(内部$let
)。
外$let
表达式,用于计算每个元素的power
值,这些值是请求字段的总和以及请求的字段值name
和location
{ {1}}阶段内的{1}}字段。
将所有位置的所有请求字段值汇总为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
由_id推送数组中的数据值,以便计算所有位置的值。
$reduce