MongoDB聚合管道中$lt日期比较不生效问题
MongoDB聚合管道日期比较问题解决方法
你遇到的问题核心是**$match阶段的常规查询语法不支持用字段引用作为比较值**——你在$match里写$lt: '$formattedDate'时,MongoDB会把'$formattedDate'当成字符串字面量,而不是你之前生成的字段值,所以自然匹配不到数据。
修正方案1:用$expr实现字段比较
把$match里的条件用$expr包裹,这样就能使用聚合表达式来引用字段进行比较:
[ { $addFields: { formattedDate: { $dateToString: { format: '%Y-%m-%d', date: '$$NOW' } } } }, { $set: { formattedDate: { $toDate: '$formattedDate' } } }, { $match: { $expr: { $and: [ { $lt: ['$effectiveFrom', '$formattedDate'] }, { $lt: ['$createdDate', '$formattedDate'] } ] } } } ]
修正方案2:用$dateTrunc直接生成当天0点日期(更高效)
没必要先转字符串再转日期,MongoDB 5.0+支持的$dateTrunc可以直接把当前时间截断到“天”级别,得到UTC当天0点的日期,简化管道:
[ { $match: { $expr: { $and: [ { $lt: ['$effectiveFrom', { $dateTrunc: { date: '$$NOW', unit: 'day' } }] }, { $lt: ['$createdDate', { $dateTrunc: { date: '$$NOW', unit: 'day' } }] } ] } } } ]
这个方案省去了额外的字段添加阶段,性能更好,逻辑也更直接。
内容的提问来源于stack exchange,提问作者Juhi Shrivastava
相关产品推荐
相关产品推荐

