You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:45:40