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

