MongoDB聚合如何基于$$NOW计算当前日期之后的下一个周二日期
实现方案
注意需使用$isoDayOfWeek获取ISO周天数(周一为1、周二为2、周日为7),不要用$dayOfWeek,后者是周日为1的计数规则,不符合需求。
1. MongoDB 5.0 及以上版本(推荐)
通过计算需要偏移的天数,直接用$dateAdd做日期偏移即可:
- 若当前ISO周天数小于2,偏移天数为
2 - 当前ISO周天数 - 若当前ISO周天数大于等于2,偏移天数为
9 - 当前ISO周天数(刚好是周二当天的话偏移7天取下周周二,满足「当前日期之后第一个」的要求)
完整聚合管道代码:
[ { $addFields: { nextTuesday: { $dateAdd: { startDate: "$$NOW", unit: "day", amount: { $let: { vars: { currentDow: { $isoDayOfWeek: "$$NOW" } }, in: { $cond: [ { $lt: ["$$currentDow", 2] }, { $subtract: [2, "$$currentDow"] }, { $subtract: [9, "$$currentDow"] } ] } } } } } } } ]
2. 兼容MongoDB 5.0以下版本
如果版本不支持$dateAdd,可以直接通过毫秒数计算日期偏移:
[ { $addFields: { nextTuesday: { $add: [ "$$NOW", { $multiply: [ 86400000, // 1天对应的毫秒数 { $let: { vars: { currentDow: { $isoDayOfWeek: "$$NOW" } }, in: { $cond: [ { $lt: ["$$currentDow", 2] }, { $subtract: [2, "$$currentDow"] }, { $subtract: [9, "$$currentDow"] } ] } } } ] } ] } } } ]
验证示例
- 输入
$$NOW为2021-09-13T16:20:00Z(周一,ISO周天数1):偏移1天,输出2021-09-14T16:20:00Z符合预期 - 输入
$$NOW为2021-09-16T16:20:00Z(周四,ISO周天数4):偏移5天,输出2021-09-21T16:20:00Z符合预期 - 输入当天为周二时,偏移7天返回下一周的周二,满足要求
内容的提问来源于stack exchange,提问作者levi.hrb
相关产品推荐
相关产品推荐

