MongoDB使用$dateFromString查询location_id:1特定时段最低湿度文档无返回求助
MongoDB查询无结果问题排查与修正
存在的错误点
- 测量类型名称不匹配:你查询时匹配的
medidas.tipo_medida值为Humedad,但实际文档中湿度的类型值为Humedad_relativa,匹配条件不成立导致无结果。 - 操作符拼写错误:聚合操作符
$addFields被误写为$add-Fields,语法错误导致查询逻辑执行失败。 - 湿度数据提取逻辑错误:你使用
$slice: ["$medidas",-1]取测量数组的最后一个元素,但从示例文档可见湿度不一定是数组的最后一项,会导致过滤后丢失湿度数据。 - 时间范围匹配逻辑问题:你设置的
Hora:{$gt:8, $lt:18}会排除8点整和18点整的数据,若要包含早8点到晚6点的完整范围,应改为$gte:8, $lte:18。 - 数组排序逻辑问题:未提取出湿度对应的数值就直接对
medidas.valor排序,数组结构会导致排序逻辑不符合预期。
修正后的查询语句
db.datos_sensores2.aggregate([ // 先过滤符合基本条件的文档,减少后续计算量提升性能 { $match: { location_id: 1, "medidas.tipo_medida": "Humedad_relativa" } }, // 转换时间类型,提取周几和小时字段 { $addFields: { timestamp: {$dateFromString: {dateString: "$timestamp"}}, dia_semana: {$dayOfWeek: {$dateFromString: {dateString: "$timestamp"}}}, Hora: {$hour: {$dateFromString: {dateString: "$timestamp"}}} } }, // 过滤周一到周五、早8点到晚6点的时间范围 { $match: { dia_semana: {$in: [2,3,4,5,6]}, Hora: {$gte: 8, $lte: 18} } }, // 提取湿度对应的测量值用于排序 { $addFields: { humedad_valor: { $getField: { input: { $arrayElemAt: [ {$filter: { input: "$medidas", cond: {$eq: ["$$this.tipo_medida", "Humedad_relativa"]} }}, 0 ] }, field: "valor" } } } }, // 按湿度升序排序取前5条 {$sort: {humedad_valor: 1}}, {$limit: 5}, // 格式化输出字段,删除中间计算生成的冗余字段 { $project: { timestamp: 1, sensor_id: 1, location_id: 1, medidas: 1, _id: 0 } } ])
额外注意事项
如果你的时间字符串保存的是本地时区而非UTC时区,需要在$dateFromString中添加timezone参数指定对应时区,避免小时计算出现偏移。
内容的提问来源于stack exchange,提问作者Gaby
相关产品推荐
相关产品推荐

