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

问题描述 投票:2回答:1

我有类似的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

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

mongodb mongoose mongodb-query aggregation-framework
1个回答
1
投票

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

第一部分是计算每个位置的总和值。

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

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

外部$let表达式计算每个元素的power值,它是所请求字段的总和以及聚合请求字段值namelocation作为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
© www.soinside.com 2019 - 2024. All rights reserved.