目录

  1. 什么是 MongoDB MapReduce?
  2. MapReduce 的用途
  3. MapReduce 的结构
  4. MapReduce 示例
  5. MapReduce 与 Aggregation 的对比
  6. 参考资料

什么是 MongoDB MapReduce?

MapReduce 是 MongoDB 提供的一种数据处理机制,它允许你对集合中的大量文档进行复杂的聚合与转换操作。这个机制模仿的是 Hadoop 的 MapReduce 模型,主要用于执行分布式数据处理任务。

在 MongoDB 中,MapReduce 是通过 JavaScript 函数来实现的,使用 map 函数处理输入文档并发出键值对,然后使用 reduce 函数对这些键值对进行分组和聚合处理,最终可以通过 finalize 函数进一步转换结果。


MapReduce 的用途

MapReduce 适用于以下类型的任务:

  • 日志分析
  • 分类统计(如商品销量、页面点击等)
  • 数据清洗与转换
  • 多字段组合聚合统计
  • 替代复杂 SQL 的聚合逻辑

MapReduce 的结构

MongoDB 中的 MapReduce 操作通常由以下几个部分组成:

  • map:一个函数,用来遍历集合中的文档,并生成一个或多个键值对。
  • reduce:一个函数,接受 map 阶段输出的键值对并进行归并处理。
  • finalize(可选):在 reduce 后对结果进一步加工。

语法格式

db.collection.mapReduce(
  mapFunction,
  reduceFunction,
  {
    out: { inline: 1 } // 或指定集合名 { merge: "outputCollection" }
  }
);


MapReduce 示例

假设我们有一个名为 orders 的集合,其中包含如下结构的订单数据:

{
  "_id": 1,
  "item": "apple",
  "price": 10,
  "quantity": 5
}

目标:统计每种商品的总销售金额。

map 函数

var mapFunction = function() {
  emit(this.item, this.price * this.quantity);
};

reduce 函数

var reduceFunction = function(key, values) {
  return Array.sum(values);
};

执行 MapReduce

db.orders.mapReduce(
  mapFunction,
  reduceFunction,
  {
    out: "order_totals"
  }
)

查看结果

db.order_totals.find()

输出结果类似:

{ "_id": "apple", "value": 50 }
{ "_id": "banana", "value": 30 }


MapReduce 与 Aggregation 的对比

特性MapReduceAggregation Pipeline
使用语言JavaScriptMongoDB 原生操作符
性能较慢更快
可读性灵活但复杂简洁清晰
推荐用途非常复杂的逻辑处理一般统计分析

提示:除非处理逻辑特别复杂,推荐使用 Aggregation Framework 来替代 MapReduce。


参考资料

如需更多技术教程与使用指南,请访问 www.52kanjuqing.com