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

指定SQL查询转换为MongoDB Aggregate聚合语句问题咨询

正确的MongoDB聚合查询语句

db.customers.aggregate([
  // 对应SQL WHERE子句:先过滤性别为female的文档,减少后续计算量
  { $match: { gender: "female" } },
  // 对应SQL GROUP BY子句:按accountType分组,同时计算分组条数、组内平均余额
  {
    $group: {
      _id: "$accountType",
      groupCount: { $count: {} },
      avgBalance: { $avg: "$balance" }
    }
  },
  // 对应SQL HAVING子句:筛选分组条数小于140的分组
  { $match: { groupCount: { $lt: 140 } } },
  // 对应SELECT的字段格式化:调整输出字段结构,对平均余额保留两位小数
  {
    $project: {
      _id: 0, // 关闭默认返回的_id字段
      accountType: "$_id",
      avgBalance: { $round: ["$avgBalance", 2] }
    }
  },
  // 对应SQL ORDER BY子句:按平均余额升序排序
  { $sort: { avgBalance: 1 } },
  // 对应SQL LIMIT子句:只返回第一条结果
  { $limit: 1 }
])

如果需要强制返回NumberDecimal类型的avgBalance,可以把$project里的avgBalance行修改为:

avgBalance: { $toDecimal: { $round: ["$avgBalance", 2] } }

原有代码的核心问题

  • 阶段顺序错误:MongoDB聚合管道按书写顺序执行,全表过滤的$match(对应WHERE)必须放在最前,排序、limit要放在字段格式化之后,之前的顺序完全混乱。
  • $group语法错误:分组键直接写_id: "$accountType"即可,不需要嵌套对象;同时分组内需要额外计算分组条数给HAVING条件使用,平均余额不能放在分组键里。
  • 语法和拼写错误:单独的{ gender: "female" }不是合法的聚合阶段,必须放在$match内;$agv是拼写错误,正确为$avg;$round的第一个参数是已经计算好的平均余额,不能直接对原始balance字段做计算。
  • 遗漏了$sort阶段:原SQL有按avgBalance排序的逻辑,不加这个阶段返回的第一条结果不符合预期。
  • 字段映射错误:没有关闭默认的_id字段,输出结构和要求的格式不符。

内容的提问来源于stack exchange,提问作者tryingToLearnSomething

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:06:01