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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:39:04