如何统计MongoDB数组元素数量?获取评论最多的10个产品失败
解决MongoDB获取评论数最多的10个产品问题
原代码的问题
你用mapReduce的思路存在两个关键问题:
- mapReduce配置中的
sort参数是对输入的products集合文档排序,而你的集合里并没有count_reviews字段,所以这个排序规则完全不生效。 - 此处场景根本不需要用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
相关产品推荐
相关产品推荐

