第40章 MongoDB Map Reduce教程

第40章 MongoDB Map Reduce教程

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) return 键值对。

参数说明:

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

以下实例在集合 orders 中查找 status:“A” 的数据,并根据 cust_id 来分组,并计算 amount 的总和。


使用 MapReduce

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


    >db.posts.insert({
       "post_text": "liulianjiangcsdn教程,最全的技术文档。",
       "user_name": "mark",
       "status":"active"
    })
    WriteResult({ "nInserted" : 1 })
    >db.posts.insert({
       "post_text": "liulianjiangcsdn教程,最全的技术文档。",
       "user_name": "mark",
       "status":"active"
    })
    WriteResult({ "nInserted" : 1 })
    >db.posts.insert({
       "post_text": "liulianjiangcsdn教程,最全的技术文档。",
       "user_name": "mark",
       "status":"active"
    })
    WriteResult({ "nInserted" : 1 })
    >db.posts.insert({
       "post_text": "liulianjiangcsdn教程,最全的技术文档。",
       "user_name": "mark",
       "status":"active"
    })
    WriteResult({ "nInserted" : 1 })
    >db.posts.insert({
       "post_text": "liulianjiangcsdn教程,最全的技术文档。",
       "user_name": "mark",
       "status":"disabled"
    })
    WriteResult({ "nInserted" : 1 })
    >db.posts.insert({
       "post_text": "liulianjiangcsdn教程,最全的技术文档。",
       "user_name": "liulianjiangcsdn",
       "status":"disabled"
    })
    WriteResult({ "nInserted" : 1 })
    >db.posts.insert({
       "post_text": "liulianjiangcsdn教程,最全的技术文档。",
       "user_name": "liulianjiangcsdn",
       "status":"disabled"
    })
    WriteResult({ "nInserted" : 1 })
    >db.posts.insert({
       "post_text": "liulianjiangcsdn教程,最全的技术文档。",
       "user_name": "liulianjiangcsdn",
       "status":"active"
    })
    WriteResult({ "nInserted" : 1 })

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


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

以上 mapReduce 输出结果请在输出结果查看


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

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

具体参数说明:

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

使用 find 操作符来查看 mapReduce 的查询结果请在输出结果查看


    > var map=function() { emit(this.user_name,1); }
    > var reduce=function(key, values) {return Array.sum(values)}
    > var options={query:{status:"active"},out:"post_total"}
    > db.posts.mapReduce(map,reduce,options)
    { "result" : "post_total", "ok" : 1 }
    > db.post_total.find();

以上查询显示如下结果:


    { "_id" : "mark", "value" : 4 }
    { "_id" : "liulianjiangcsdn", "value" : 1 }

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

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

本专栏所有文章

第1章 MongoDB 教程第2章 NoSQL 简介教程
第3章 MongoDB 简介教程第4章 Windows MongoDB教程
第5章 Linux MongoDB教程第6章 OSX MongoDB教程
第7章 MongoDB 概念解析教程第8章 MongoDB 连接教程
第9章 MongoDB 创建数据库教程第10章 MongoDB 删除数据库教程
第11章 MongoDB 创建集合教程第12章 MongoDB 删除集合教程
第13章 MongoDB 插入文档教程第14章 MongoDB 更新文档教程
第15章 MongoDB 删除文档教程第16章 MongoDB 查询文档教程
第17章 MongoDB 条件操作符教程第18章 MongoDB $type 操作符教程
第19章 MongoDB Limit与Skip方法教程第20章 MongoDB 排序教程
第21章 MongoDB 索引教程第22章 MongoDB 聚合教程
第23章 MongoDB 复制(副本集)教程第24章 MongoDB 分片教程
第25章 MongoDB 备份与恢复教程第26章 MongoDB 监控教程
第27章 MongoDB Java教程第28章 MongoDB PHP 扩展教程
第29章 MongoDB PHP教程第30章 MongoDB PHP7教程
第31章 Node.js MongoDB教程第32章 MongoDB 关系教程
第33章 MongoDB 数据库引用教程第34章 MongoDB 覆盖索引查询教程
第35章 MongoDB 查询分析教程第36章 MongoDB 原子操作教程
第37章 MongoDB 高级索引教程第38章 MongoDB 索引限制教程
第39章 MongoDB ObjectId教程第40章 第40章 MongoDB Map Reduce教程教程
第41章 MongoDB 全文检索教程第42章 MongoDB 正则表达式教程
第43章 MongoDB 管理工具教程第44章 MongoDB GridFS教程
第45章 MongoDB 固定集合教程第46章 MongoDB 自动增长教程

寄语

本文有榴莲酱CSDN原创,欢迎点赞、转载,博客地址:https://blog.csdn.net/qq441540598

  • 永远不要狠命地把门在身后"砰"地关上,因为你很可能还要回来。
  • 慢慢承受着,学着不诉哀伤,是的,隐忍,我会努力,我会回归最初的淡漠,再见,自以为是的青春,再见,想象中的美好。
  • 永远都不要放弃你真正想做的事情,有梦想的人远比现实的人强大。
  • 有一种真话是人所需要的,它以羞耻的火焰烧掉人心头的污秽和庸欲
  • 发愿改过,明须良朋提醒,幽须鬼神证明,一心忏悔,昼夜不懈,必有效验。积善:积善之家,必有余庆。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榴莲酱csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值