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

使用Mongoose无法按日期查询集合问题求助

解决MongoDB指定日期查询返回空的问题

我来帮你搞定这个查询问题,你的代码里有两个关键问题导致返回空结果,咱们逐个解决:

1. JavaScript Date的月份是从0开始的!

你可能没注意到,JavaScript的Date构造函数里,月份参数是0索引的——比如1月对应0,9月对应8,而不是你传入的数字9。如果前端传的month是9(代表9月),你直接用它创建Date的话,实际生成的是10月的日期,自然匹配不到数据库里9月的记录。

修复方式:创建日期时把月份减1,同时把请求参数转成数字(避免字符串导致的构造错误):

let year = parseInt(req.query.year);
let month = parseInt(req.query.month);
let day = parseInt(req.query.day);

// 月份减1,转成JS Date需要的0索引格式
let startDate = new Date(year, month - 1, day);

2. 日期范围的边界设置错误

你现在把startDate和endDate设成了同一个时间(当天的00:00:00),但数据库里的日期是带时分秒的(比如2019-09-06T16:48:14.000+00:00),这些时间都比当天0点要晚,所以$gte: startDate且$lte: endDate的条件,只会匹配刚好是当天0点的记录,而你的数据里没有这样的记录,所以返回空。

正确的范围设置:把endDate设为第二天的00:00:00,然后用$lt(小于)这个时间,这样就能覆盖当天所有从00:00:00到23:59:59的记录:

// 开始日期是当天0点
let startDate = new Date(year, month - 1, day);
// 结束日期是第二天0点
let endDate = new Date(year, month - 1, day + 1);

// 查询条件改成 $gte 开始日期,$lt 结束日期
let query = SALES.find({ date: { $gte: startDate, $lt: endDate }});

修正后的完整代码

let year = parseInt(req.query.year);
let month = parseInt(req.query.month);
let day = parseInt(req.query.day);

// 修正月份索引和日期范围
let startDate = new Date(year, month - 1, day);
let endDate = new Date(year, month - 1, day + 1);

let query = SALES.find({ date: { $gte: startDate, $lt: endDate }});
query.exec(function (err, item) {
  if (err) return handleError(err);
  if (item === null || item.length === 0) {
    res.json({ status: 'empty' });
  } else {
    res.json({ salesRecord: item });
  }
});

额外验证小技巧

你可以在代码里打印生成的日期,确认范围是否正确:

console.log('开始日期:', startDate.toISOString());
console.log('结束日期:', endDate.toISOString());

比如你查询2019年9月9日的话,应该输出:

开始日期: 2019-09-09T00:00:00.000Z
结束日期: 2019-09-10T00:00:00.000Z

这样就能覆盖数据库里所有2019-09-09当天的记录了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:28:19