前段时间学习了一下mongoDB的mapReduce但是一直没时间把文章整理出来,这几天忽然才想起来。mapReduce能实现几乎所有聚合函数的功能,但是使用mapReduce的结果就是执行效率稍微低一点,这次要分享的是一个有关分组统计的mapreduce
1.mapReduce组成
mapReduce由map和reduce两部分组成,我查了下资料是这么说的:
map函数和reduce函数是交给用户实现的,这两个函数定义了任务本身。
- map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。
- reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。
2.我的表结构
假设这个就是一个非常简单的订单表,现在要求统计每个人支付的总费用,关系型数据库当然很好实现,直接搞个sum和group by就OK了
3.使用mapreduce实现简单的统计
先编写map函数:
function Map() {
emit(
this.customer, // how to group
{count: 1, price: this.price} // associated data point (document)
);
}
其实我们要写的部分只是amit里面的几句,第一个配置的是分组的条件,后面则是一个map集合这个集合最重要的price这个值,按照上面的要求我们需要把price累加起来
之后就是接收符合map条件的数据的reduce部分:
function Reduce(key, values) {
var reduced = {count:0, totalprice:0}; // initialize a doc (same format as emitted value)
values.forEach(function(val) {
reduced.totalprice += val.price; // reduce logic
reduced.count += val.count;
});
return reduced;
}
values就是接收到的数据,从foreach里面的代码就能清楚的看明白这个部分完成什么功能了,第一句是累加价格,第二句是累加订单数
4.使用mongovue执行mapreduce要注意的地方
最后来看看执行效果:
这样在mongoDB里就实现类似关系数据库的group功能了