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
相关产品推荐
相关产品推荐

