如何获得总和的总和和总和,这也是mongoDB中项目的总和

时间:2018-02-25 23:37:36

标签: mongodb mongoose mongodb-query aggregation-framework

我有类似如下的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"}
                                    }
                            }
                        }
                    }
                ])

给出如下输出

enter image description here

我不确定如何达到我的要求

1 个答案:

答案 0 :(得分:1)

您可以在3.4中使用以下聚合。

第一部分是计算每个地点的总和值。

第二部分是汇总所有地点的总和值。

对于每个{$mapdata行,$filter on字段为真的数据文档,然后$sum power每个请求字段的值(内部$let)。

$let表达式,用于计算每个元素的power值,这些值是请求字段的总和以及请求的字段值namelocation { {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