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

MongoDB聚合查询问题:筛选平均评分最高产品的错误排查

问题分析与解决方案

首先,你的核心问题是错误地在$group阶段嵌套使用了$max和$avg,这完全偏离了你想要的逻辑:

当你写{$max: {$avg: "$assessments.assessment"}}时,MongoDB的执行顺序是:

  1. 经过$unwind后,每个文档都是单条用户评分记录,此时$avg作用在单个assessments.assessment值上,结果就是这个值本身;
  2. 接着$max是在每个产品的分组里,取这些单条评分的最大值——所以你得到的是每个产品的最高单条评分,而不是所有产品平均评分中的最大值。

正确的解决方案

下面提供几种不同的实现方式,你可以根据需求选择:

方法1:$sort + $limit(最简单直观)

先计算每个产品的平均评分,然后按平均分降序排序,最后只取第一条,就是平均评分最高的产品:

db.products.aggregate([
  { $unwind: "$assessments" },
  { $group: { _id: "$name", avg_assessment: { $avg: "$assessments.assessment" } } },
  { $project: { _id: 0, product: "$_id", avg_assessment: 1 } },
  { $sort: { avg_assessment: -1 } }, // 按平均评分从高到低排序
  { $limit: 1 } // 只保留排名第一的产品
])

执行后会得到正确结果:

{ "avg_assessment" : 4.9, "product" : "Product2" }

方法2:全局分组找最大值(支持多产品同分场景)

如果存在多个产品平均评分相同且都是最高分的情况,上面的$limit只会返回其中一个。这种方法可以把所有最高分的产品都找出来:

db.products.aggregate([
  // 第一步:计算每个产品的平均评分
  { $unwind: "$assessments" },
  { $group: { _id: "$name", avg_assessment: { $avg: "$assessments.assessment" } } },
  { $project: { _id: 0, product: "$_id", avg_assessment: 1 } },
  // 第二步:全局统计最高平均分,并收集所有产品数据
  { $group: {
      _id: null,
      max_avg_score: { $max: "$avg_assessment" },
      all_products: { $push: "$$ROOT" }
    }
  },
  // 第三步:筛选出平均分等于最高分的产品
  { $unwind: "$all_products" },
  { $match: { "all_products.avg_assessment": "$max_avg_score" } },
  { $replaceRoot: { newRoot: "$all_products" } }
])

方法3:窗口函数$rank(MongoDB 5.0+推荐)

利用MongoDB 5.0及以上支持的窗口函数,直接给每个产品的平均分排名,然后筛选排名第一的产品,代码更简洁,也支持多产品同分:

db.products.aggregate([
  { $unwind: "$assessments" },
  { $group: { _id: "$name", avg_assessment: { $avg: "$assessments.assessment" } } },
  { $project: { _id: 0, product: "$_id", avg_assessment: 1 } },
  // 给每个产品按平均分降序排名
  { $setWindowFields: {
      sortBy: { avg_assessment: -1 },
      output: { rank: { $rank: {} } }
    }
  },
  // 只保留排名第一的产品
  { $match: { rank: 1 } },
  { $project: { rank: 0 } }
])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:28:20