如何用MapReduce计算平均值?MongoDB汽车集合里程平均值求解
嘿,我来帮你搞定MongoDB MapReduce计算平均里程的问题!
你之前写的最小值逻辑是直接在reduce阶段筛选出最小数值,但平均值的计算需要同时跟踪总里程数和数据条目数,最后用总里程除以条目数得到结果。所以我们需要调整Map、Reduce函数,再加上一个finalize函数来完成最后的平均值计算。
完整代码实现
// Map函数:每个文档输出分类,以及包含计数和里程的对象 var map = function() { emit(this.Classification, { count: 1, sum: this.Milage }); }; // Reduce函数:累加同一分类下的计数和总里程 var reduce = function(key, values) { var result = { count: 0, sum: 0 }; values.forEach(function(value) { result.count += value.count; result.sum += value.sum; }); return result; }; // Finalize函数:计算平均值,添加到结果中 var finalize = function(key, reducedValue) { reducedValue.avg = reducedValue.sum / reducedValue.count; return reducedValue; }; // 执行MapReduce db.ads.mapReduce( map, reduce, { query: { Classification: "Motor Cars" }, out: { inline: 1 }, finalize: finalize } );
代码细节解释
- Map阶段:每个文档对应一条数据,所以我们给
count设为1,sum就是当前文档的里程数,通过emit把分类作为key,这个对象作为value输出。 - Reduce阶段:MongoDB会把同一个
Classification下的所有value集合起来,我们需要遍历这些value,把count和sum分别累加,得到该分类下的总条目数和总里程。 - Finalize阶段:这是可选但关键的一步——在reduce完成后,我们用总里程除以总条目数得到平均值,把它添加到结果对象里返回,这样就能直接得到最终的平均里程了。
执行这段代码后,你会得到类似这样的结果:
{ "_id": "Motor Cars", "value": { "count": X, // X是Motor Cars类别的文档总数 "sum": Y, // Y是所有Motor Cars的里程总和 "avg": Z // Z就是我们要的平均里程 } }
内容的提问来源于stack exchange,提问作者Abdi




