如何修改MongoDB聚合查询筛选到期前3天的商品?
修正MongoDB聚合查询以筛选未来3天内过期的商品
问题核心
你要筛选的是当前日期后3天内过期的商品,但现有查询存在两个关键问题:
- 在
$match的普通查询条件里直接使用聚合运算符($dateSubtract),MongoDB不支持这种写法; - 日期逻辑搞反了——你用
$dateSubtract把当前日期减3天,匹配的是已经过期超过3天的商品,和你要找的“即将过期(未来3天内)”的需求完全相反。
修正后的查询
db.collection.aggregate([ { "$unwind": "$products" }, { "$match": { "$expr": { "$and": [ // 确保商品还未过期(过期日期 >= 当前日期) { "$gte": ["$products.expiryDate", new Date()] }, // 过期日期在当前日期+3天以内 { "$lte": ["$products.expiryDate", { "$dateAdd": { startDate: new Date(), unit: "day", amount: 3 } }] } ] } } }, { "$addFields": { "products.section": "$section" } }, { "$replaceRoot": { "newRoot": "$products" } } ])
关键修改说明
- 用
$expr包裹聚合表达式:$match阶段默认不支持聚合操作符,必须用$expr声明后,才能在查询条件中使用$dateAdd、$gte这类聚合运算符; - 替换
$dateSubtract为$dateAdd:计算当前日期往后推3天的日期,作为过期日期的上限,符合“未来3天内过期”的需求; - 添加
$gte条件:过滤掉已经过期的商品,只保留即将过期的目标商品。
特殊情况:仅筛选刚好3天后过期的商品
如果你的需求是仅匹配过期日期恰好为当前日期后3天的商品,可简化$match条件:
{ "$match": { "$expr": { "$eq": ["$products.expiryDate", { "$dateAdd": { startDate: new Date(), unit: "day", amount: 3 } }] } } }
内容的提问来源于stack exchange,提问作者Ian McInnes
相关产品推荐
相关产品推荐

