runCommand语法:
db.runCommand({
mapreduce:<collection>,
map:<mapfunction>,
reduce:<reducefunction>,
[,query:<query filter object>]
[,sort:<sorts the input objects using this key.Useful for optimization,like sorting by the emit key for fewer reduces>]
[,limit:<number of objects to return from collection>]
[,out:<see output options below>]
[,keeptemp:<true|false>]
[,finalize:<finalizefunction>]
[,scope:<object where fields go into javascript global scope>]
[,verbose:true]
});
也可以这样写
db.collectionname.mapReduce(mapfunction,reducefunction,{mout:outcollection});
说明:
- Mapreduce:要操作的目标集合
- Map:映射函数(生成键值对序列,作为reduce函数参数)
- Reduce:统计函数
- Query:目标记录过滤
- Sort:目标记录排序
- Limit:限制目标记录数量
- Out:统计结果存放集合(不指定使用临时集合,在客户端断开后自动删除)
- Keeptemp:是否保留临时集合
- Finalize:最终处理函数(对reduce返回结果进行最终整理后存入结果集合)
- Scope:向map、reduce、finalize导入外部变量
- Verbose:显示详细的时间统计信息。
处理顺序
- 查询指定Collection
- 调用 map 对结果集进行mapper处理
- 执行finalize方法处理
- 最终结果集输出到临时Collection中
- 断开连接,临时Collection删除或保留。
map 文档输入
function(){emit(分组条件key,需要统计的对象value);}
分组条件key会对应最终结果集里的_id主键。
reduce 统计函数
典型的reduce函数:
function(key,values){
//key对应map里的key,values是同一个key对应的map里 value的数组。
//可以这样遍历values values.forEach(function(){});
var ret={age:key,names:values};
return ret;
}
finalize 最终处理
function(key,rval){
if(key==0){
rval.msg="a new life,baby!";
}
return rval
}