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
相关产品推荐
相关产品推荐

