MongoDB Map Reduce 学习笔记

什么是 Map Reduce?

MapReduce 是一种用于数据处理的分布式算法。它可以把大批量数据分配到多台计算机上进行处理,并将结果合并成最终的输出。MongoDB 的 MapReduce 实现基于 JavaScript 进行编写,使用 map 和 reduce 函数进行数据处理和结果合并。

Map Reduce 的基本流程

MapReduce 的基本流程包括三个步骤:map、reduce 和 finalize。

Map

在 Map 阶段,MapReduce 将输入数据集拆分成若干小块,在每个小块上运行用户指定的 map 函数。Map 函数的作用是将输入数据集转换成一个键值对序列。

例如,假设有一个文档集合,其中每个文档都包含一个数字数组。下面是一个简单的 map 函数,用于将数组中的每个元素都加 1:

javascriptCopy Code
function map() { for (var i = 0; i < this.numbers.length; i++) { emit(this._id, this.numbers[i] + 1); } }

在上面的 map 函数中,emit 函数用于产生一个键值对,其中键为文档的 id,值为数组中的一个元素加 1。

Reduce

在 Reduce 阶段,MapReduce 将所有具有相同键的键值对分组在一起,并将它们传递给一个用户指定的 reduce 函数进行处理。Reduce 函数的作用是对相同键的值进行聚合。

例如,假设我们要对上面的结果进行聚合,计算每个文档中数组元素的和。下面是一个简单的 reduce 函数,用于计算每个键的值的总和:

javascriptCopy Code
function reduce(key, values) { var total = 0; for (var i = 0; i < values.length; i++) { total += values[i]; } return total; }

在上面的 reduce 函数中,输入参数 key 是一个键,values 是一个值的数组。函数遍历 values 数组,将所有元素相加得到总和,并将总和作为输出结果返回。

Finalize

Finalize 阶段是可选的,它允许用户对 reduce 函数的输出结果再进行一次处理。例如,用户可以对 reduce 函数的输出结果进行排序、格式化等操作。

Map Reduce 的实例

下面是一个实际的 MapReduce 实例,用于统计 MongoDB 中某个集合中每个国家的人口数量:

Map 函数

javascriptCopy Code
function map() { emit(this.country, this.population); }

上面的 map 函数将每个文档的 country 字段作为键,population 字段作为值,产生一个键值对序列。

Reduce 函数

javascriptCopy Code
function reduce(key, values) { var total = 0; for (var i = 0; i < values.length; i++) { total += values[i]; } return total; }

上面的 reduce 函数对每个键的值进行求和。

Finalize 函数

javascriptCopy Code
function finalize(key, reducedValue) { return { country: key, population: reducedValue }; }

上面的 finalize 函数将 reduce 函数的输出结果转换为一个包含国家和人口数量的 JSON 对象。

最后,我们可以使用以下代码来执行 MapReduce:

javascriptCopy Code
db.collection.mapReduce( map, reduce, { out: "result", finalize: finalize } );

上面的代码会在 result 集合中生成统计结果。可以使用以下代码来查看统计结果:

javascriptCopy Code
db.result.find();

上面的代码将会输出从 MongoDB 中的 result 集合中检索到的所有统计结果。