MongoDB聚合查询:如何在$lookup中实现每日数据平均值计算
修改聚合查询以返回每日数据平均值
你需要在$lookup的子管道中添加$group阶段,按日期分组计算平均值,替换原有的$sort(或调整顺序)。以下是修改后的完整代码:
Sensor.aggregate([ { $match: { _id: ObjectId(req.params.id) }, }, { $lookup: { from: "sensordatas", as: "daily_avg_data", let: { device_id: "$device_id" }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ["$device_id", "$$device_id"] }, { $gte: ["$datum", moment(startdate).toDate()] }, { $lte: ["$datum", moment(enddate).toDate()] }, ], }, }, }, // 按日期分组计算平均值 { $group: { _id: { // 将datum格式化为YYYY-MM-DD的日期字符串作为分组键 date: { $dateToString: { format: "%Y-%m-%d", date: "$datum" } } }, // 替换为你实际需要计算平均值的字段名,比如reading、value等 avg_value: { $avg: "$your_numeric_field" } } }, // 按日期排序(可选,根据需求调整顺序) { $sort: { "_id.date": 1 } }, // 可选:重命名字段让结果更直观 { $project: { _id: 0, date: "$_id.date", avg_value: 1 } } ], }, }, ])
关键修改说明:
- 移除无用变量:原
let中的datum没有实际作用,直接删除简化逻辑。 - 添加
$group阶段:- 用
$dateToString把时间字段datum转换为YYYY-MM-DD格式的字符串,作为每日分组的唯一标识。 - 通过
$avg操作符计算目标数值字段的每日平均值,记得把$your_numeric_field替换成集合中实际存储传感器数据的字段名(比如temperature、humidity等)。
- 用
- 可选优化:
$project阶段将分组用的_id.date重命名为date,移除冗余的_id字段,让返回结构更简洁。$sort阶段按日期升序排列结果,可改为-1实现降序。
修改后,查询会返回指定时间范围内的每日平均值,数据量会大幅降低。
内容的提问来源于stack exchange,提问作者Wouter
相关产品推荐
相关产品推荐

