1. Map 阶段:
在 Map 阶段,你定义一个 JavaScript 函数,该函数作用于每个文档并输出键值对。这些键值对被临时存储在一个中间集合中,以供 Reduce 阶段使用。
// 例子:Map 函数
var mapFunction = function() {
emit(this.category, 1);
};
在上面的例子中,emit 函数用于输出键值对,这里输出的是文档的 category 字段作为键,值为1。
2. Reduce 阶段:
在 Reduce 阶段,你定义一个 JavaScript 函数,该函数接收 Map 阶段输出的键值对,并执行聚合操作。Reduce 函数的输出将作为最终结果。
// 例子:Reduce 函数
var reduceFunction = function(key, values) {
return Array.sum(values);
};
在上面的例子中,Reduce 函数对相同键的值进行求和。
执行 Map-Reduce 操作:
执行 Map-Reduce 操作时,你需要指定集合、Map 函数、Reduce 函数以及最终结果的输出集合等参数。
// 例子:执行 Map-Reduce 操作
db.collection.mapReduce(
mapFunction,
reduceFunction,
{ out: "resultCollection" }
);
在上面的例子中,collection 是你要执行 Map-Reduce 操作的集合,resultCollection 是结果输出的集合。
注意事项:
- Map-Reduce 是适用于处理大规模数据集的操作,对于小规模数据,使用聚合框架更为简单。
- Map-Reduce 过程中使用 JavaScript,可能会影响性能。在一些情况下,可以使用 Aggregation Pipeline 来代替 Map-Reduce。
- Map-Reduce 是一种分布式计算模型,可用于在多台机器上并行执行计算。
请注意,从 MongoDB 4.2 开始,Aggregation Pipeline 提供了更为灵活和性能更好的聚合操作,因此在新的应用中,推荐使用 Aggregation Pipeline 替代 Map-Reduce。
转载请注明出处:http://www.zyzy.cn/article/detail/14246/MongoDB