如何使用Mongoose在MongoDB中按指定时间段查询数据
代码存在的核心问题
- 区间逻辑颠倒:
$gte(大于等于)和$lte(小于等于)的赋值对象完全写反,你构造的查询条件要求发布日期同时大于当月月末、小于当月月初,属于不存在的无效区间,必然返回空数组。 - 月份参数偏移:JavaScript
Date构造函数的月份入参为0基计数规则(0对应1月,11对应12月),如果接口接收的是用户传入的1-12自然月份数值,直接使用会导致查询月份整体偏移1个月。 - 月末日期硬编码错误:不同月份的实际天数不同,硬写31作为当月最后一天会导致2月、30天的小月查询边界出错。
修正方案
调整日期边界构造逻辑,修正查询区间顺序即可:
router.get("/:year/:month/all", async (req, res) => { let { year, month } = req.params; // 将用户传入的1-12自然月转为Date要求的0基索引 const adjustedMonth = +month - 1; // 当月第一天0点作为查询起始边界 const startOfMonth = new Date(+year, adjustedMonth, 1); // 下一月第0天自动适配为当月最后一天,补充时分秒到当天最后一刻避免遗漏当日数据 const endOfMonth = new Date(+year, adjustedMonth + 1, 0, 23, 59, 59, 999); const blogs = await Blog.find({ published: { $gte: startOfMonth, $lte: endOfMonth, }, }); if(!blogs || blogs.length == 0) { return res.json({ success: false, message: "No blogs Found!" }) } res.json({ success: true, message: "Blogs Found", blogs, }); });
内容的提问来源于stack exchange,提问作者Himanshu Khaitan
相关产品推荐
相关产品推荐

