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" }
} }
])