返回介绍

MongoDB Map Reduce

发布于 2025-02-22 13:46:43 字数 2797 浏览 0 评论 0 收藏 0

Map-Reduce 是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。

MongoDB 提供的 Map-Reduce 非常灵活,对于大规模数据分析也相当实用。

MapReduce 命令

以下是 MapReduce 的基本语法:

>db.collection.mapReduce(
   function() {emit(key,value);},  //map 函数
   function(key,values) {return reduceFunction},   //reduce 函数
   {
      out: collection,
      query: document,
      sort: document,
      limit: number
   }
)

使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调用 emit(key, value), 遍历 collection 中所有的记录,将 key 与 value 传递给 Reduce 函数进行处理。

Map 函数必须调用 emit(key, value) 返回键值对。

参数说明:

  • map :映射函数 (生成键值对序列,作为 reduce 函数参数)。
  • reduce 统计函数,reduce 函数的任务就是将 key-values 变成 key-value,也就是把 values 数组变成一个单一的值 value。。
  • out 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
  • query 一个筛选条件,只有满足条件的文档才会调用 map 函数。(query。limit,sort 可以随意组合)
  • sort 和 limit 结合的 sort 排序参数(也是在发往 map 函数前给文档排序),可以优化分组机制
  • limit 发往 map 函数的文档数量的上限(要是没有 limit,单独使用 sort 的用处不大)

使用 MapReduce

考虑以下文档结构存储用户的文章,文档存储了用户的 user_name 和文章的 status 字段:

{
   "post_text": "w3cschool.cc 菜鸟教程,最全的技术文档。",
   "user_name": "mark",
   "status":"active"
}

现在,我们将在 posts 集合中使用 mapReduce 函数来选取已发布的文章,并通过 user_name 分组,计算每个用户的文章数:

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, 
      {  
         query:{status:"active"},  
         out:"post_total" 
      }
)

以上 mapReduce 输出结果为:

{
   "result" : "post_total",
   "timeMillis" : 9,
   "counts" : {
      "input" : 4,
      "emit" : 4,
      "reduce" : 2,
      "output" : 2
   },
   "ok" : 1,
}

结果表明,共有 4 个符合查询条件(status:"active")的文档, 在 map 函数中生成了 4 个键值对文档,最后使用 reduce 函数将相同的键值分为两组。

具体参数说明:

  • result:储存结果的 collection 的名字,这是个临时集合,MapReduce 的连接关闭后自动就被删除了。
  • timeMillis:执行花费的时间,毫秒为单位
  • input:满足条件被发送到 map 函数的文档个数
  • emit:在 map 函数中 emit 被调用的次数,也就是所有集合中的数据总量
  • ouput:结果集合中的文档个数 (count 对调试非常有帮助)
  • ok:是否成功,成功为 1
  • err:如果失败,这里可以有失败原因,不过从经验上来看,原因比较模糊,作用不大

使用 find 操作符来查看 mapReduce 的查询结果:

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, 
      {  
         query:{status:"active"},  
         out:"post_total" 
      }
).find()

以上查询显示如下结果,两个用户 tom 和 mark 有两个发布的文章:

{ "_id" : "tom", "value" : 2 }
{ "_id" : "mark", "value" : 2 }

用类似的方式,MapReduce 可以被用来构建大型复杂的聚合查询。

Map 函数和 Reduce 函数可以使用 JavaScript 来实现,是的 MapReduce 的使用非常灵活和强大。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文