You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:54:01