聚合_mapReduce

db.emps.insert({"name":"张三","age":30,"sex":"男","job":"CLERK","salary":1000})
db.emps.insert({"name":"李四","age":28,"sex":"女","job":"CLERK","salary":5000})
db.emps.insert({"name":"王五","age":26,"sex":"男","job":"MANAGER","salary":6000})
db.emps.insert({"name":"赵六","age":32,"sex":女"","job":"MANAGER","salary":7000})
db.emps.insert({"name":"孙七","age":31,"sex":"男","job":"CLERK","salary":2000})
db.emps.insert({"name":"王八","age":35,"sex":"女","job":"PRESIDENT","salary":9000})
1. 按照职位分组,取得每个职位的人名
var jobMapFun = function(){
    emit(this.job,this.name);
}

var jobReduceFun = function(key,values){ 
    return {"job":key, "name":values}; // 输出结果
}

db.runCommand({
    "mapreduce":"emps", // 操作的是哪张表
    "map":jobMapFun, //map函数名
    "reduce":jobReduceFun, //reduce函数名
    "out":"demo01" // 输出到哪张表中
})

db.demo01.find()
2. 统计出各性别的人数、平均工资、最低工资、雇员姓名
var sexMapFun = function(){
	//定义好了分组的条件,以及每个集合要取出的内容
	emit(this.sex,{"ccount":1,"csal":this.salary,"cmax":this.salary,"cmin":this.salary,"cname":this.name});
}
var sexReduceFun = function(key,values){
	var total = 0;
	var sum = 0;
	var max = values[0].cmax;
	var min = values[0].cmin;
	var names = new Array();
	for(var x in values){ //表示循环取出里面的数据
		total += values[x].ccount;
		sum += values[x].csal;
		if(max < values[x].cmax)
			max = values[x].cmax;
		if(min > values[x].cmin)
			min = values[x].cmin;
		names[x] = values[x].cname;
	}
	var avg = (sum / total).toFixed(2); //保留2位小数
	return {"count":total,"avg":avg,"sum":sum,"max":max,"min":min,"names":names}
}

db.runCommand({
    "mapreduce":"emps",
    "map":sexMapFun,
    "reduce":sexReduceFun,
    "out":"demo02"
})
发布了298 篇原创文章 · 获赞 153 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43192537/article/details/103787073