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

MongoDB聚合查询:筛选子文档满足指定数值差值条件的文档

MongoDB聚合管道实现电压差值超阈值文档筛选

实现逻辑

需求核心规则:

  • 遍历文档内CDF.UTILITYTYPE.D5.EVENT数组的所有事件
  • 对每个事件下SNAPSHOT子数组,仅保留UNIT字段值为"V"的条目,提取对应VALUE(原数据为字符串存储,需转为数值类型)
  • 只要任意一个事件下,存在两个电压值的绝对差值大于30,该文档即命中筛选规则

优化说明:不需要枚举所有数值两两计算差值,一组数值中最大值与最小值的差值是所有两两组合差值的最大值,只要最大值减最小值大于30,就必然存在满足差值要求的两个值,计算效率远高于全量两两比对。

完整聚合管道代码

db.你的实际集合名.aggregate([
  {
    $set: {
      // 中间校验字段,存储每个EVENT是否满足电压差条件
      voltage_hit: {
        $map: {
          input: "$CDF.UTILITYTYPE.D5.EVENT",
          as: "event",
          in: {
            $let: {
              vars: {
                // 提取当前事件下所有UNIT=V的电压值,转为双精度数值
                voltages: {
                  $map: {
                    input: {
                      $filter: {
                        input: "$$event.SNAPSHOT",
                        as: "snap",
                        cond: { $eq: ["$$snap.UNIT", "V"] }
                      }
                    },
                    as: "v_snap",
                    in: { $toDouble: "$$v_snap.VALUE" }
                  }
                }
              },
              in: {
                $gt: [
                  { $subtract: [{ $max: "$$voltages" }, { $min: "$$voltages" }] },
                  30
                ]
              }
            }
          }
        }
      }
    }
  },
  {
    // 只要任意一个EVENT命中条件,就保留该文档
    $match: {
      voltage_hit: { $elemMatch: { $eq: true } }
    }
  },
  {
    // 移除中间计算字段,返回原始文档结构
    $unset: "voltage_hit"
  }
])

样例数据校验结果

提供的两份样例文档均会被筛选命中:

  • 第一份文档(G1=12387835,NAME=L1)第一个事件的电压值为114.94V、119.54V、236.78V,最大差值121.84>30
  • 第二份文档(G1=12388215,NAME=L2)第一个事件的电压值为80.45V、165.51V、245.97V,最大差值165.52>30

内容的提问来源于stack exchange,提问作者Aksheet-Goku

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:24:26