You need to enable JavaScript to run this app. 如何使用Node.js与MongoDB查询两个日期范围内的对应数据
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Node.js与MongoDB查询两个日期范围内的对应数据

实现方案

核心注意事项

  • 你当前存储的Date字段为YYYY-M-D格式字符串,直接做字符串比较会在单月/单天场景下出现匹配错误(例如"2021-7-9"字符串大于"2021-7-10"),必须转为Date类型后再做区间判断
  • 原有代码循环从i=1开始,会遗漏数组下标为0的第一条匹配记录,需要修正
  • 原有逻辑是查询所有对应用户的记录后再在JS层过滤,数据量大时性能极差,推荐直接在MongoDB查询阶段完成过滤

修改后代码(最优方案,查询层直接过滤)

如果你的MongoDB版本低于4.0不支持$toDate运算符,直接使用下方的最小改动方案即可

fetchHistorybydate = (req, res) => {
  // 取前端传入的起止日期,转成Date类型
  const fromDate = new Date(req.body.Fromdate);
  const toDate = new Date(req.body.Todate);
  // 结束日期加1天,避免结束日因时间戳为0点被漏判
  toDate.setDate(toDate.getDate() + 1);

  User.find({
    username: req.body.username,
    leave: { $exists: false },
    // 使用$expr把存储的Date字符串转成Date类型做区间判断
    $expr: {
      $and: [
        { $gte: [ { $toDate: "$Date" }, fromDate ] },
        { $lt: [ { $toDate: "$Date" }, toDate ] }
      ]
    }
  }, function(err, data) {
    if (err) {
      return res.status(300).json("Error");
    }
    const token = jwt.sign({
      data: 'foobar'
    }, 'secret', { expiresIn: "30 minute" });
    res.status(200).json({ AccessToken: token, data: data });
  })
}

最小改动方案(保留原有循环逻辑,仅修改判断条件)

如果不想改动原有逻辑结构,可以直接修改循环内的判断逻辑:

fetchHistorybydate = (req, res) => {
  const HistoryList = []
  // 转起止日期为Date类型
  const fromDate = new Date(req.body.Fromdate);
  const toDate = new Date(req.body.Todate);
  toDate.setDate(toDate.getDate() + 1);

  User.find({"username": req.body.username, "leave":{ $exists : false} }, function(err, data) {
    // 修正循环从i=0开始,避免遗漏第一条数据
    for(var i = 0 ;i < data.length; i++){
      const curDate = new Date(data[i].Date);
      // 判断是否在区间内
      if(curDate >= fromDate && curDate < toDate){
        HistoryList.push(data[i])
      }
    }
    if(err) {
      res.status(300).json("Error")
    } else {
      const token = jwt.sign({
        data: 'foobar'
      }, 'secret', { expiresIn: "30 minute"})
      res.status(200).json({AccessToken: token, data: HistoryList})
    }
  })
}

长期优化建议

建议后续插入数据时,将Date字段统一存储为Date类型,或者格式化为YYYY-MM-DD的补零字符串,后续查询可以直接用MongoDB的$gte和$lte运算符,不需要额外转类型,查询效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 00:09:02