Map-Reduce

map-reduce

参数说明:

  1. mapreduce: 要操作的目标集合。
  2. map: 映射函数 (生成键值对序列,作为 reduce 函数参数)。
  3. reduce: 统计函数。
  4. query: 目标记录过滤。
  5. sort: 目标记录排序。
  6. limit: 限制目标记录数量。
  7. out: 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
  8. keeptemp: 是否保留临时集合。
  9. finalize: 最终处理函数 (对 reduce 返回结果进行最终整理后存入结果集合)。
  10. scope: 向 map、reduce、finalize 导入外部变量。
  11. verbose: 显示详细的时间统计信息

mongoVUE:

计算一个省份里面两个城市的最短距离:

mapreduce: cities,
     map : function Map() {
		var key = this.CountryID;
		emit(key, {		//按省份ID进行分组
		   "data":[
				{	//需要获取的值
					"name" : this.City,
					//横纵坐标
					"lat"  : this.Latitude,       
					"lon"  : this.Longitude
				}
			 ]});
	}
 reduce : function Reduce(key, values) {
	var reduced = {"data":[]};
	for (var i in values) {
		var inter = values[i];
		for (var j in inter.data) {
			reduced.data.push(inter.data[j]);
		}
	}
	return reduced;
}

 finalize : function Finalize(key, reduced) {
	if (reduced.data.length == 1) {
		return { "message" : "This Country contains only 1 City" };
	}
	var min_dist = 999999999999;
	var city1 = { "name": "" };
	var city2 = { "name": "" };
	var c1;
	var c2;
	var d;
	for (var i in reduced.data) {
		for (var j in reduced.data) {
			if (i>=j) continue;
			c1 = reduced.data[i];
			c2 = reduced.data[j];
			d = Math.sqrt((c1.lat-c2.lat)*(c1.lat-c2.lat)+(c1.lon-c2.lon)*(c1.lon-c2.lon));
			if (d < min_dist && d > 0) {
				min_dist = d;
				city1 = c1;
				city2 = c2;
			}
		}
	}
	return {"city1": city1.name, "city2": city2.name, "dist": min_dist};
}
 //前置条件
 query : { "CountryID" : { "$ne" : 254 } }
 out : { inline : 1 }
 });
JAVA代码实现:
 MapReduceOptions mapReduceOptions = new MapReduceOptions();
 mapReduceOptions.finalizeFunction(finalizeFunction)
 mapReduceOptions.limit(limit)
 mongoTemplate.mapReduce(inputCollectionName, mapFunction, reduceFunction, mapReduceOptions, entityClass)
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值