mongoDB使用mapreduce实现简单的统计功能

本文介绍如何使用MongoDB的mapReduce实现简单的分组统计功能,包括map和reduce函数的编写,以及在MongoDB中执行mapReduce的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间学习了一下mongoDB的mapReduce但是一直没时间把文章整理出来,这几天忽然才想起来。mapReduce能实现几乎所有聚合函数的功能,但是使用mapReduce的结果就是执行效率稍微低一点,这次要分享的是一个有关分组统计的mapreduce

1.mapReduce组成

mapReduce由map和reduce两部分组成,我查了下资料是这么说的:

map函数和reduce函数是交给用户实现的,这两个函数定义了任务本身。

  • map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。
  • reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。
简单的说map更侧重分组的实现,也就是在map里配置分组的条件并把符合条件的数据传递给reduce,reduce的则负责取得符合map分组条件的数据并实现真正的统计功能


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功能了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值