使用Mongoose筛选昨日数据异常:今日数据被纳入求和结果求助
解决Mongoose聚合查询前一天记录包含今日数据的问题
你的问题出在日期范围的时间部分没有重置:当前代码里的yesterday只是把日期减了1天,但保留了当前的时分秒(比如现在是今天14:30,yesterday就是昨天14:30),所以$gte: yesterday, $lt: new Date()的范围是「昨天14:30到今天14:30」,自然会包含今天0点到14:30的记录。
要准确获取前一天的完整数据,需要把日期范围限定在昨天00:00:00 到 今天00:00:00,具体修正如下:
// 获取昨天的起始时间(00:00:00) const startOfYesterday = new Date(); startOfYesterday.setDate(startOfYesterday.getDate() - 1); startOfYesterday.setHours(0, 0, 0, 0); // 获取今天的起始时间(00:00:00),作为范围的结束边界 const startOfToday = new Date(); startOfToday.setHours(0, 0, 0, 0); const sums = salesSchema.aggregate([ { $match: { createdAt: { $gte: startOfYesterday, $lt: startOfToday } } }, { $group: { _id: null, total: { $sum: { $multiply: ["$price", "$quantity"] } } } } ]);
补充说明
setHours(0, 0, 0, 0)会把日期对象的时、分、秒、毫秒全部重置为0,确保起始和结束时间都是当天的零点。- 使用
$lt: startOfToday而不是new Date(),能彻底避免把今天已经产生的记录包含进来。
内容的提问来源于stack exchange,提问作者Naheem Olaniyan
相关产品推荐
相关产品推荐

