使用MapReduce要实现两个函数Map和Reduce函数。Map函数调用emit(key, value),遍历Collection中所有的记录,将key与value传递给Reduce函数进行处理。
MapReduce的基本语法和参数说明:
db.runCommand(
{
mapreduce : 要操作的目标集合,
map : 映射函数(生成键值对序列,作为reduce函数参数),
reduce : 统计函数,
[, query : 文档,发往map函数前先给过渡文档]
[, sort : 文档,发往map函数前先给文档排序]
[, limit : 整数,发往map函数的文档数量上限]
[, out : 字符串,统计结果保存的集合]
[, keeptemp: 布尔值,链接关闭时临时结果集合是否保存]
[, finalize : 函数,将reduce的结果送给这个函数,做最后的处理]
[, scope : 文档,向map、reduce、finalize导入外部变量]
[, jsMode : 布尔值,是否减少执行过程中BSON和JS的转换,默认true]
//注: false时 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可处理非常大的mapreduce
true时 BSON-->js-->map-->reduce-->BSON
[, verbose : 布尔值,是否产生更加详细的服务器日志,默认true]
}
);
MapReduce操作后返回的文档包含很多与操作有关的元信息:
> db.runCommand({
"mapreduce": "test",
"map": m,
"reduce": r,
"out":{inline:1} // 1.8版本以上需要指明out选项,该行指定输出结果在控制台
});
{
"result": "tmp.mr.mapreduce_12723563222_1", // 存放MapReduce结果的集合名,这是个临时集合,MapReduce的连接关闭后它会被自动删除。
"timeMillis": 12, // 操作花费的时间,单位:毫秒
"counts": { // 用于调试信息
"input": 6, // 发送到map函数的文档个数
"emit": 14, // 在map函数中emit被调用的次数
"reduce": 5, // reduce函数执行次数
"output": 5 // 结果集合中的文档数量
},
"ok": true
}
社区中的MapReduce示例