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

如何统计MongoDB数组元素数量?获取评论最多的10个产品失败

解决MongoDB获取评论数最多的10个产品问题

原代码的问题

你用mapReduce的思路存在两个关键问题:

  1. mapReduce配置中的sort参数是对输入的products集合文档排序,而你的集合里并没有count_reviews字段,所以这个排序规则完全不生效。
  2. 此处场景根本不需要用mapReduce——每个产品的评论数就是reviews数组的长度,直接计算即可,mapReduce反而增加了不必要的复杂度。

推荐解决方案:使用聚合框架

聚合框架是处理这类统计排序需求的最优选择,代码简洁且性能更高:

db.products.aggregate([
  // 投影需要的字段,并计算评论数
  {
    $project: {
      "_id": 1,
      "product/title": 1,
      "product/price": 1,
      "reviews": 1,
      "count_reviews": { $size: "$reviews" }
    }
  },
  // 按评论数降序排序
  { $sort: { count_reviews: -1 } },
  // 取前10个结果
  { $limit: 10 }
])

若坚持使用mapReduce的修改方案

如果一定要用mapReduce实现,需要先完成mapReduce计算,再手动对结果排序取前10:

var mapFunction = function() {
    emit(this._id, {
        product: this,
        count_reviews: this.reviews.length
    });
};

// 因每个产品_id唯一,reduce函数不会被触发,直接返回第一个值即可
var reduceFunction = function(key, values) {
    return values[0];
};

// 执行mapReduce并处理结果
var mapResult = db.products.mapReduce(mapFunction, reduceFunction, { out: { inline: 1 } });
// 按评论数降序排序结果数组
mapResult.results.sort((a, b) => b.value.count_reviews - a.value.count_reviews);
// 输出前10个
printjson(mapResult.results.slice(0, 10));

内容的提问来源于stack exchange,提问作者duje.je

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:50:45