使用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
相关产品推荐
相关产品推荐

