如何使用MongoDB Aggregation Framework查询多时间维度温度统计数据
MongoDB多时间维度温度数据聚合实现方案
首先建议提前为date、deviceId字段建立联合索引,可大幅降低聚合查询的耗时。以下聚合规则中温度默认取时段内平均值,可根据实际需求将$avg替换为$max(最大值)、$min(最小值)、$sum(累计值)等算子。
各维度Aggregation Pipeline实现
小时级聚合
输出格式完全匹配要求,hours字段自动映射为1-24对应0-1点到23-24点:
[ // 可选:添加$match指定查询的时间范围、设备ID { $project: { deviceId: 1, temperature: 1, hourOfDay: { $hour: "$date" }, hourStart: { $dateTrunc: { date: "$date", unit: "hour" } } } }, { $group: { _id: { deviceId: "$deviceId", hourStart: "$hourStart" }, avgTemp: { $avg: "$temperature" } } }, { $project: { _id: 0, dataType: "Temperature", deviceID: "$_id.deviceId", timing: "Hourly", temperature: "$avgTemp", date: "$_id.hourStart", hours: { $add: [ { $hour: "$_id.hourStart" }, 1 ] } } }, { $sort: { date: 1 } } ]
日级聚合(10月3日-11月3日)
[ { $match: { date: { $gte: ISODate("2023-10-03T00:00:00.000Z"), $lte: ISODate("2023-11-03T23:59:59.999Z") } } }, { $project: { deviceId: 1, temperature: 1, dayStart: { $dateTrunc: { date: "$date", unit: "day" } } } }, { $group: { _id: { deviceId: "$deviceId", dayStart: "$dayStart" }, avgTemp: { $avg: "$temperature" } } }, { $project: { _id: 0, dataType: "Temperature", deviceID: "$_id.deviceId", timing: "Daily", temperature: "$avgTemp", date: "$_id.dayStart" } }, { $sort: { date: 1 } } ]
注:如需匹配其他年份的10月3日-11月3日,修改$match中的时间范围即可。
周级聚合(最近7周)
[ { $match: { date: { $gte: { $dateAdd: { startDate: "$$NOW", unit: "week", amount: -7 } } } } }, { $project: { deviceId: 1, temperature: 1, weekStart: { $dateTrunc: { date: "$date", unit: "week", startOfWeek: "monday" // 可选,指定周起始为周一,默认是周日 } } } }, { $group: { _id: { deviceId: "$deviceId", weekStart: "$weekStart" }, avgTemp: { $avg: "$temperature" } } }, { $project: { _id: 0, dataType: "Temperature", deviceID: "$_id.deviceId", timing: "Weekly", temperature: "$avgTemp", date: "$_id.weekStart" } }, { $sort: { date: 1 } } ]
月级聚合
[ { $project: { deviceId: 1, temperature: 1, monthStart: { $dateTrunc: { date: "$date", unit: "month" } } } }, { $group: { _id: { deviceId: "$deviceId", monthStart: "$monthStart" }, avgTemp: { $avg: "$temperature" } } }, { $project: { _id: 0, dataType: "Temperature", deviceID: "$_id.deviceId", timing: "Monthly", temperature: "$avgTemp", date: "$_id.monthStart" } }, { $sort: { date: 1 } } ]
其他实现建议
- 如果你使用的是MongoDB 5.0及以上版本,建议将数据存储到时序集合中,内置的降采样功能针对该类固定间隔的时序数据做了专项优化,查询性能比普通集合高30%以上,还支持自动按规则归档历史数据。
- 如果该类聚合查询的频次很高,可新增预聚合汇总表,通过定时任务定期跑对应维度的聚合结果写入汇总表,查询时直接读取汇总表即可,可大幅降低线上查询延迟,适合高并发访问场景。
内容的提问来源于stack exchange,提问作者Rajkishore Jena
相关产品推荐
相关产品推荐

