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

如何在MongoDB聚合$match阶段基于计算年份值筛选2007年注册用户?

解决MongoDB聚合$match阶段使用$year运算符的错误问题

错误原因

$match阶段默认采用查询过滤器语法,不支持直接在顶层使用聚合运算符(如$year),这就是你遇到unknown top level operator: $year错误的核心原因。聚合运算符仅能在聚合表达式语境下使用,比如$project、$expr这类支持表达式的阶段中。

解决方案

有两种可行方式实现筛选2007年注册用户的需求:

方案1:先投影计算年份,再匹配

先通过$project提取注册年份,再用$match筛选目标年份,最后保留需要的字段:

db.users.aggregate([
  {
    $project: {
      name: 1,
      registeredYear: { $year: { $convert: { input: "$registered.date", to: "date" } } }
    }
  },
  {
    $match: { registeredYear: 2007 }
  },
  {
    $project: { _id: 0, name: 1 } // 移除不需要的字段
  }
])

方案2:使用$expr在$match中直接计算(推荐)

$expr允许在$match的查询过滤器中使用聚合表达式,无需额外的$project阶段,性能更优:

db.users.aggregate([
  {
    $match: {
      $expr: {
        $eq: [
          { $year: { $convert: { input: "$registered.date", to: "date" } } },
          2007
        ]
      }
    }
  },
  { $project: { _id: 0, name: 1 } }
])

说明

  • $expr的作用是将聚合表达式转化为查询过滤器可识别的逻辑,让你能在$match阶段直接对字段进行计算和比较。
  • 方案2避免了中间投影大量数据的开销,对于数据量较大的集合,推荐优先使用这种方式。

内容的提问来源于stack exchange,提问作者D. Rattansingh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:57:29