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
相关产品推荐
相关产品推荐

