MongoDB中如何使用Map-Reduce?

在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"
  }  
)