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

如何修改MongoDB聚合查询筛选到期前3天的商品?

修正MongoDB聚合查询以筛选未来3天内过期的商品

问题核心

你要筛选的是当前日期后3天内过期的商品,但现有查询存在两个关键问题:

  1. 在$match的普通查询条件里直接使用聚合运算符($dateSubtract),MongoDB不支持这种写法;
  2. 日期逻辑搞反了——你用$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:42:42