Node.js中导入MongoDB的ISODate函数实现日期范围查询的问题
问题解决方案
1. 关于ISODate的疑问
Node.js的MongoDB驱动会自动将原生Date对象转换为MongoDB可识别的ISODate格式,不需要额外导入ISODate函数,你使用new Date()的方向是正确的,问题出在其他地方。
2. 日期查询不生效的原因&解决
你调试输出的时间存在时区差:setHours方法是按照运行Node.js服务的本地时区计算时间,你输出的带Z后缀的是UTC标准时间,从你给出的日志可以看出本地时区是东八区,setHours(0,0,0)生成的是东八区的0点,对应UTC时间的前一天22点,和你数据库中存储的UTC格式的created字段不匹配,导致查询区间不对。
替换为UTC时间设置方法即可:
// 按UTC时区生成当天0点整 const startOfDay = new Date() startOfDay.setUTCHours(0, 0, 0, 0) // 按UTC时区生成当天最后一毫秒 const endOfDay = new Date() endOfDay.setUTCHours(23, 59, 59, 999)
修改后的$match逻辑可以简化(不需要额外写$and):
$match: { type: req.query.type, created: { $gt: startOfDay, $lt: endOfDay } }
3. ReferenceError: amount is not defined报错解决
aggregate查询返回的结果是数组,哪怕分组后只有一条统计结果,也会包裹在数组中,你应该是直接取了trxs.amount才会报错,正确的取值方式为:
const totalAmount = trxs[0]?.amount || 0
如果返回的数组为空,说明没有符合查询条件的记录,默认返回0即可。
额外注意
你给出的示例文档中created日期为2021-09-31,9月没有31日,属于非法日期,如果真实数据存在这类问题也会导致查询异常,请先确认实际存储的日期格式合法。
内容的提问来源于stack exchange,提问作者fp007
相关产品推荐
相关产品推荐

