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

MongoDB动态日期字段查询超30天文档的实现问题

问题原因

你当前的写法核心错误是在MongoDB聚合管道中直接使用undefined作为比较值,MongoDB无法识别该语法,导致字段存在性判断逻辑完全失效,因此else分支不会触发。

判断字段不存在时 fallback 到另一个字段,不需要写复杂的$cond逻辑,直接使用MongoDB内置的$ifNull运算符即可,它的作用就是返回第一个非空(非null/不存在)的表达式结果。


修正方案1:保留addFields阶段的写法

[
  {
    "$addFields": {
      "dateToUse": {
        "$ifNull": ["$lastAlertSentDate", "$createdDate"]
      }
    }
  },
  {
    "$match": {
      "dateToUse": {
        "$lte": new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) // 替换为你实际的30天前时间对象
      }
    }
  }
]

修正方案2:省略addFields,直接在match中完成逻辑

可以省去单独的字段计算阶段,在$match中结合$expr直接写判断逻辑,性能无差异,写法更简洁:

[
  {
    "$match": {
      "$expr": {
        "$lte": [
          { "$ifNull": ["$lastAlertSentDate", "$createdDate"] },
          new Date(Date.now() - 30 * 24 * 60 * 60 * 1000)
        ]
      }
    }
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:36:03