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

Node.js查询MongoDB日期范围内字段平均值返回空数组问题

问题分析与解决方案

核心问题排查

你的查询返回空数组,根源在以下几个点:

  • 日期类型不兼容:前端传入的日期是字符串格式,但MongoDB中timestamp是Date类型,直接用字符串匹配会导致无结果。
  • 字段值类型错误:数据库里fc/spO2等字段存储的是字符串(如"99"),$avg无法直接对字符串计算平均值。
  • 字段引用方式错误:$avg参数用了字符串字面量,而非MongoDB要求的字段引用语法,导致无法正确识别目标字段。
  • 空结果未处理:当$match无匹配数据时,直接访问result[0]会抛出异常。

修复后的代码

app.post('/getMedia', async (req, res) => {
  console.log(req.body)

  const { firstDate, secondDate, collection, parametro } = req.body;

  // 把前端日期字符串转为MongoDB可识别的Date对象
  const startDate = new Date(firstDate);
  const endDate = new Date(secondDate);

  try {
    await client.connect();
    const database = client.db('xyz');
    const coll = database.collection(collection);

    const result = await coll.aggregate([
      {
        $match: {
          timestamp: {
            $gte: startDate,
            $lte: endDate
          }
        }
      },
      {
        // 将目标字符串字段转换为数值类型,保证$avg可计算
        $addFields: {
          numericField: { $toDouble: `$${parametro}` }
        }
      },
      {
        $group: {
          _id: null,
          averageField: { $avg: "$numericField" }
        }
      }
    ]).toArray();

    // 处理无匹配数据的情况,避免报错
    if (result.length === 0) {
      return res.json(null); // 可根据业务需求返回0或提示文本
    }

    const average = result[0].averageField;
    console.log(average);
    res.json(average);
  } catch (error) {
    res.status(500).json({ error: '计算平均值时发生错误' });
    console.error(error);
  } finally {
    // 建议在finally块关闭连接,避免资源泄漏
    await client.close();
  }
})

额外优化建议

  • 日期有效性校验:转换日期前先校验firstDate和secondDate是否为合法日期字符串,避免生成无效Date对象。
  • 字段存在性处理:可以在$addFields中用$ifNull处理目标字段不存在的情况,防止转换失败。
  • 连接复用:服务启动时就建立MongoDB连接,而非每次请求都重新连接,提升性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:15:16