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

MongoDB聚合分组后如何获取totalSaleAmount最大值的所有文档

解决方案:获取分组后销售额最大值的所有文档

你之前的问题核心是**$match阶段不能使用聚合运算符$max**,$match仅支持查询运算符,因此需要调整聚合流程来实现需求。以下提供两种可行方案:


方案一:兼容全版本的全局分组匹配

通过全局分组收集所有结果并计算最大值,再筛选出符合条件的文档:

db.sales.aggregate([
  // 1. 按item分组,计算每个商品的总销售额
  {
    $group: {
      _id: "$item",
      totalSaleAmount: { $sum: { $multiply: ["$price", "$quantity"] } }
    }
  },
  // 2. 全局分组,收集所有分组结果并计算销售额最大值
  {
    $group: {
      _id: null,
      allItemSales: { $push: "$$ROOT" },
      maxTotalAmount: { $max: "$totalSaleAmount" }
    }
  },
  // 3. 展开结果数组
  { $unwind: "$allItemSales" },
  // 4. 匹配出销售额等于最大值的文档
  {
    $match: {
      $expr: { $eq: ["$allItemSales.totalSaleAmount", "$maxTotalAmount"] }
    }
  },
  // 可选:调整输出格式,移除临时字段
  {
    $replaceRoot: { newRoot: "$allItemSales" }
  }
])

方案二:MongoDB 5.0+高效实现(推荐)

使用$setWindowFields直接计算全局最大值,无需额外分组和展开:

db.sales.aggregate([
  // 1. 按item分组,计算每个商品的总销售额
  {
    $group: {
      _id: "$item",
      totalSaleAmount: { $sum: { $multiply: ["$price", "$quantity"] } }
    }
  },
  // 2. 为每个文档添加全局销售额最大值字段
  {
    $setWindowFields: {
      partitionBy: null, // 不分区,全局范围计算
      output: {
        globalMaxAmount: { 
          $max: "$totalSaleAmount", 
          window: { documents: ["unbounded", "unbounded"] } // 包含所有文档的窗口
        }
      }
    }
  },
  // 3. 筛选出销售额等于全局最大值的文档
  {
    $match: {
      $expr: { $eq: ["$totalSaleAmount", "$globalMaxAmount"] }
    }
  },
  // 可选:移除临时字段
  { $unset: "globalMaxAmount" }
])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:40:22