在MongoDB中使用Map-Reduce主要有以下几个步骤:
1、 定义map函数。
- map函数接收key和value(文档)作为输入,并生成中间数据(key和value)作为输出。
var map = function() {
emit(this.gender, this.age);
}
2、 定义reduce函数。
- reduce函数接收key和所有value(上个阶段输出的value)作为输入,并汇总为一个值作为输出。
var reduce = function(key, values) {
var total = 0;
for (var i = 0; i < values.length; i++) {
total += values[i];
}
return total;
}
3、 执行mapReduce()命令。
- 需要指定map函数、reduce函数和输出集合等信息。
db.users.mapReduce(
map,
reduce,
{
out: "map_reduce_example",
query: {age: {$gt: 50}}
}
)
4、 指定额外的选项。
- 比如查询过滤器query、最终输出形式out、连接输出集合merge、 finale函数等。
var mapReduceOptions = {
query: { status: "A" },
out: { reduce: "map_reduce_result" },
merge: {
db: "analytics",
coll: "stats_by_status",
onDisk: true // 连接操作可能非常耗时,使用onDisk可以提高性能
},
scope: { // 向map/reduce函数传递上下文变量
discount_rate: 0.5
},
finalize: // 处理最终 reduce值的函数
function (key, value) { return value * discount_rate; }
}
5、 聚合MapReduce的执行结果。
- 可以在聚合管道中引用MapReduce生成的输出集合。
6、 使用inline将map和reduce函数直接嵌入到命令中。
- 这避免了在shell中定义JS函数,更方便。
db.users.mapReduce(
function() { emit(this.gender, this.age); },
function(key, values) {
var total = 0;
for (var i = 0; i < values.length; i++) {
total += values[i];
}
return total;
},
{
query: { status: "A" },
out: "map_reduce_result"
}
)