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

Mongoose如何查询最近24小时内指定idStation对应的传感器测量数据

问题排查与修复方案

核心原因(最高发情况)

Mongoose的aggregate管道不会像普通find查询一样自动根据Schema定义转换字段类型,绝大多数筛选失效的问题都是idStation字段的类型不匹配导致的:比如你传入的id是字符串类型,但集合中存储的idStation是MongoDB的ObjectId类型,直接匹配会完全命中不到数据。

修复步骤

1. 先确认数据库中idStation的实际类型

执行以下代码打印一条24小时内的原始数据,查看idStation的字段名和值类型:

console.log(await Data.findOne({
  createdAt: { $gt: new Date(Date.now() - 24 * 60 * 60 * 1000) }
}))

2. 根据匹配的类型修正查询

如果确认idStation是ObjectId类型,将传入的字符串id转换为ObjectId即可,修正后的代码如下:

import mongoose from 'mongoose';

const getSensorMeasurementForThePastDay = async (id: string) => {
  // 可选:先校验id合法性,避免非法参数报错
  if (!mongoose.Types.ObjectId.isValid(id)) {
    return [];
  }
  const measurements = await Data.aggregate([
    {
      $match: {
        createdAt: { $gt: new Date(Date.now() - 24 * 60 * 60 * 1000) },
        // 转换为ObjectId类型匹配
        idStation: new mongoose.Types.ObjectId(id)
      }
    }
  ]);
  return measurements;
}

如果idStation确实是字符串类型,检查是否有以下问题:

  • 字段名拼写错误、大小写不匹配
  • 传入的id参数有前后空格,可改为idStation: id.trim()匹配
  • 存在特殊字符或者编码不一致的情况,可打印参数和数据库的值做对比

额外说明

$match中多个条件默认是逻辑与的关系,不需要额外写$and包裹,简化后不影响查询逻辑。

内容的提问来源于stack exchange,提问作者Nikolay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:15:03