MongoDB嵌套GroupBy

MongoDB嵌套GroupBy,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有如下示例数据: (每个楼层都有多个传感器数据) 对于响应,我需要计算每个楼层的总荷载和每天的单独荷载。期望的响应如下所示: { "TotalLoad": 3214, "Floor_Id": "Galileo_001", "LoadUnit": "Kgs", "AssetStatus": [{ "TotalLoad": 200, "LoadUnit": "Kgs", "Date": "1539588994"

我有如下示例数据: (每个楼层都有多个传感器数据)

对于响应,我需要计算每个楼层的总荷载和每天的单独荷载。期望的响应如下所示:

{
    "TotalLoad": 3214,
    "Floor_Id": "Galileo_001",
    "LoadUnit": "Kgs",
    "AssetStatus": [{
        "TotalLoad": 200,
        "LoadUnit": "Kgs",
        "Date": "1539588994"
    }, {
        "TotalLoad": 400,
        "LoadUnit": "Kgs",
        "Date": "1539475200"
    }, {
        "TotalLoad": 100,
        "LoadUnit": "Kgs",
        "Date": "1539388800"
    }]
}
我正在撰写以下Mongo汇总:

db.sensordata.aggregate([{"$unwind" : "$Sensor_data" },
{"$group": {
     "_id": {"Floor_Id": "$Floor_Id", 
         "DailyDate":{"$dateFromParts":{
                    "year":{"$year":{"$add": [new Date("1970-01-01"), "$Sensor_data.Timestamp"]}},
                    "month":{"$month":{"$add": [new Date("1970-01-01"), "$Sensor_data.Timestamp"]}},
                    "day":{"$dayOfMonth":{"$add": [new Date("1970-01-01"), "$Sensor_data.Timestamp"]}}
                      } 
                  }
             },
     "AssetLoad": {"$sum": "$Sensor_data.Load" }
    }
},
{
    "$group" : {
            "_id": {"Floor_Id": "$_id.Floor_Id"},
            "TotalLoad": { "$sum": "$Sensor_data.Load" },
            "AssetStatus":{
                "$push":{
                    "TotalLoad": "$AssetLoad",
                    "LoadUnit": "Kgs",
                    "Date": "$_id.DailyDate"
                    }
                }
        }
}
])
问题: 对于每层计算的总荷载,我得到0

{
    "_id" : {
        "Floor_Id" : "Galileo_001"
    },
    "TotalLoad" : 0,
    "AssetStatus" : [ 
        {
            "TotalLoad" : 8.5480665,
            "LoadUnit" : "Kgs",
            "Date" : ISODate("2018-09-25T00:00:00.000Z")
        }
    ]
}
我做错了什么?
如何获得所需的输出?

您得到的是零,因为第二个
$group
管道无法识别字段
传感器数据。Load
因此默认为0

替换表达式

"TotalLoad": { "$sum": "$Sensor_data.Load" },
管道更改后,字段
AssetLoad

"TotalLoad": { "$sum": "$AssetLoad" },

要计算每个楼层总共有多少个传感器,您的第一条管道需要计算传感器的大小 使用的传感器数据,使用将其存储在新字段中,然后使用操作符将该字段保留在前面的管道阶段管道中

将您的管道修改为以下内容:

db.sensordata.aggregate([
    { "$addFields": {
      "TotalSensors": { "$size": "Sensor_data" }
    } },
    {"$unwind" : "$Sensor_data" },
    { "$group": {
      "_id": {
          "Floor_Id": "$Floor_Id", 
          "DailyDate": {
              "$dateFromParts": {
                  "year": { "$year": {
                      "$add": [new Date("1970-01-01"), "$Sensor_data.Timestamp"]
                  } },
                  "month": { "$month": {
                      "$add": [new Date("1970-01-01"), "$Sensor_data.Timestamp"]
                  } },
                  "day": { "$dayOfMonth": {
                      "$add": [new Date("1970-01-01"), "$Sensor_data.Timestamp"]
                  } }
              } 
          }
      },
      "AssetLoad": {"$sum": "$Sensor_data.Load" },
      "TotalSensors": { "$first": "$TotalSensors" }
    } },
    { "$group" : {
        "_id": {"Floor_Id": "$_id.Floor_Id"},
        "TotalLoad": { "$sum": "$Sensor_data.Load" },
        "AssetStatus":{
            "$push": {
              "TotalLoad": "$AssetLoad",
              "LoadUnit": "Kgs",
              "Date": "$_id.DailyDate"
            }
        },
        "TotalSensors": { "$first": "$TotalSensors" }
    } }
])

如果我想计算每层楼总共有多少个传感器,该怎么办?我已经更新了我的答案,但一般来说,在发布不同的问题后更改答案被认为是一种不好的做法,因为这可能会误导未来的读者,他们会发现提供的答案与所问的不匹配。看见
db.sensordata.aggregate([
    { "$addFields": {
      "TotalSensors": { "$size": "Sensor_data" }
    } },
    {"$unwind" : "$Sensor_data" },
    { "$group": {
      "_id": {
          "Floor_Id": "$Floor_Id", 
          "DailyDate": {
              "$dateFromParts": {
                  "year": { "$year": {
                      "$add": [new Date("1970-01-01"), "$Sensor_data.Timestamp"]
                  } },
                  "month": { "$month": {
                      "$add": [new Date("1970-01-01"), "$Sensor_data.Timestamp"]
                  } },
                  "day": { "$dayOfMonth": {
                      "$add": [new Date("1970-01-01"), "$Sensor_data.Timestamp"]
                  } }
              } 
          }
      },
      "AssetLoad": {"$sum": "$Sensor_data.Load" },
      "TotalSensors": { "$first": "$TotalSensors" }
    } },
    { "$group" : {
        "_id": {"Floor_Id": "$_id.Floor_Id"},
        "TotalLoad": { "$sum": "$Sensor_data.Load" },
        "AssetStatus":{
            "$push": {
              "TotalLoad": "$AssetLoad",
              "LoadUnit": "Kgs",
              "Date": "$_id.DailyDate"
            }
        },
        "TotalSensors": { "$first": "$TotalSensors" }
    } }
])