MongoDB聚合查询:筛选达标设备组并找出总安培最低的时间点
解决方案(MongoDB聚合实现)
假设你的集合名为device_metrics,指定的设备ID数组为targetDevices(比如[1,2,3,4,5]),目标查询日期为targetDate(比如"2024-05-20"),可以通过以下聚合管道实现需求:
完整聚合管道代码
db.device_metrics.aggregate([ // 1. 基础筛选:目标日期、指定设备、电压达标 { $match: { date: targetDate, device: { $in: targetDevices }, voltage: { $gte: 27.0 } } }, // 2. 按时间点分组,收集设备数据并统计数量、总安培值 { $group: { _id: "$time", devices: { $push: "$device" }, totalAmperage: { $sum: "$amperage" }, deviceCount: { $sum: 1 } } }, // 3. 只保留所有指定设备都达标的时间点(设备数量等于目标设备数) { $match: { deviceCount: targetDevices.length } }, // 4. 按总安培值升序排序,最前面的就是总安培最低的 { $sort: { totalAmperage: 1 } }, // 5. 只取第一条(总安培最低的时间点) { $limit: 1 }, // 可选:调整输出格式,只返回需要的字段 { $project: { _id: 0, time: "$_id", totalAmperage: 1, devices: 1 } } ])
各阶段说明
- 第一阶段$match:先过滤掉无关数据,只保留目标日期、指定设备范围内、电压≥27的记录,减少后续计算量。
- $group:按
time字段分组,把每个时间点的设备ID存入数组,同时直接计算该时间点的总安培值,统计当前时间点的有效设备数量。 - 第二阶段$match:筛选出设备数量等于目标设备总数的分组——因为如果有设备未达标,第一阶段会过滤掉它,分组后的数量就会小于目标设备数,只有数量相等的分组,才代表该时间点所有指定设备都满足电压要求。
- $sort:按总安培值从小到大排序,排序后第一个结果就是总安培最低的时间点。
- $limit:只保留第一条结果,即你需要的总安培最低的时间点;如果存在多个时间点总安培值相同且为最低,去掉这一步可返回所有符合条件的记录。
- $project(可选):调整输出字段格式,让结果更直观,比如把原分组用的
_id(对应时间)重命名为time,去掉不必要的字段。
内容的提问来源于stack exchange,提问作者JustMark
相关产品推荐
相关产品推荐

