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

使用$$NOW实现MongoDB动态聚合筛选近一年数据遇阻求助

解决MongoDB聚合中用$$NOW筛选近一年记录的问题

问题根源

你遇到的两个写法无效的原因分别是:

  • 第一个写法:$match的普通查询语法不支持直接使用聚合运算符(比如$subtract),必须用$expr把聚合表达式包裹起来,才能在$match里执行计算逻辑。
  • 第二个写法:ISODate("$startDate")是错误用法——$startDate是$set阶段生成的字段引用,不能用ISODate()函数解析,而且同样需要$expr来实现字段间的比较。

正确写法

方法1:用$expr在$match中直接计算(推荐)

直接在$match里用$expr包裹日期计算逻辑,同时推荐用MongoDB 5.0+支持的$dateSubtract替代$subtract,因为它会自动处理闰年、月份天数差异等问题,比硬算365天更准确:

[
  {
    $match: {
      $expr: {
        $gte: [
          "$_created",
          { $dateSubtract: { startDate: "$$NOW", amount: 1, unit: "year" } }
        ]
      }
    }
  }
]

如果坚持用$subtract,也要用$expr包裹:

[
  {
    $match: {
      $expr: {
        $gte: [
          "$_created",
          { $subtract: ["$$NOW", { $multiply: [1000, 60, 60, 24, 365] }] }
        ]
      }
    }
  }
]

方法2:先计算起始日期再匹配

如果要先通过$set生成起始日期,后续阶段匹配时直接引用字段即可,不用ISODate():

[
  {
    $set: {
      startDate: { $dateSubtract: { startDate: "$$NOW", amount: 1, unit: "year" } }
    }
  },
  {
    $match: {
      $expr: { $gte: ["$_created", "$startDate"] }
    }
  }
]

额外提示

  • 用$dateSubtract/$dateAdd比硬算毫秒数更可靠,尤其是涉及跨年、闰年的场景。
  • 你的MongoDB版本是6.0.3,完全支持$dateSubtract,放心用。

内容的提问来源于stack exchange,提问作者Georges

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:22:14