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

MongoDB如何按嵌套数组指定类型的valor字段排序并获取最小值?

解决方案

问题原因

你原来的查询直接对medidas.valor排序时,MongoDB会遍历数组中所有valor字段的值进行排序,而非仅针对tipo_medida: 'Temperatura'对应的valor,所以才会出现按相对湿度值排序的错误结果。

正确查询方式(聚合管道)

使用MongoDB聚合管道可以精准筛选出温度数据并排序,最终计算乘以1.2后的值:

db.datos_sensores.aggregate([
  // 筛选目标位置且包含温度测量的文档
  { $match: { location_id: 2, "medidas.tipo_medida": "Temperatura" } },
  // 将medidas数组拆分为单个文档,独立处理每个测量项
  { $unwind: "$medidas" },
  // 仅保留温度类型的测量文档
  { $match: { "medidas.tipo_medida": "Temperatura" } },
  // 按温度值升序排序,取最小的第一条数据
  { $sort: { "medidas.valor": 1 } },
  { $limit: 1 },
  // 计算温度值乘以1.2后的结果,同时保留需要的字段
  { $project: {
      _id: 1,
      timestamp: 1,
      sensor_id: 1,
      location_id: 1,
      temperatura_original: "$medidas.valor",
      temperatura_multiplicada: { $mul: ["$medidas.valor", 1.2] },
      unidad: "$medidas.unidad"
    }
  }
])

语句说明

  • $match:先过滤目标位置的文档,减少后续处理的数据量;第二次$match精准筛选出温度测量项。
  • $unwind:拆分数组,让每个测量项成为独立文档,实现对单一类型测量的单独排序。
  • $sort + $limit:按温度值升序排序后取第一条,直接得到最小温度值。
  • $project:重新组织输出字段,用$mul完成数值乘以1.2的计算。

简化版(仅获取核心结果)

如果不需要保留原文档的额外字段,可以简化为:

db.datos_sensores.aggregate([
  { $match: { location_id: 2, "medidas.tipo_medida": "Temperatura" } },
  { $unwind: "$medidas" },
  { $match: { "medidas.tipo_medida": "Temperatura" } },
  { $sort: { "medidas.valor": 1 } },
  { $limit: 1 },
  { $project: {
      min_temperatura: "$medidas.valor",
      min_temperatura_x1.2: { $mul: ["$medidas.valor", 1.2] },
      unidad: "$medidas.unidad"
    }
  }
])

内容的提问来源于stack exchange,提问作者José Siles Blanco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:50:17