mapReduce从字面上来理解就是两个过程:map映射以及reduce化简。是一种大数据处理方法,其难度不高,从性能上来说属于比较暴力的(通过N台服务器同时来计算),但相较于group以及aggregate来说,功能更强大,并更加灵活。

  1. 映射过程:先把某一类数据分组归类,这里的映射过程是支持分布式的,一边遍历每一台服务器,一边进行分类。

  2. 化简过程:然后再在分组中进行运算,这里的化简过程也是支持分布式的,在分类的过程中直接运算了。也就是说如果是一个求和的过程,先在a服务器分组求和,然后再在b服务器分组求和····最后再把化简以后的数据进行最终处理。在映射化简的过程都是每台服务器自己的CPU在运算,大量的服务器同时来进行运算工作,这就是大数据基本理念。

mapReduce可以用js语法来写。下面是结构:

db.table.mapReduce(  map,  reduce,  {  query: query,  out: out,    //指定结果集以什么方式存储,可选参数包括:  //replace:如果文档(table)存在,则替换table,  //merge:如果文档中存在记录,则覆盖已存在的文档记录  //reduce: 如果文档中存在相同key的记录了,则先计算两条记录,然后覆盖旧记录  // {inline:1}  在内存中存储记录,不写入磁盘(用户数据量少的计算)
            sort: sort,  limit: limit,  finalize: function  //这个function主要用来在存入out之前可以修改数据,function(key,values) {   //return modifiedValues;}  scope: document,    //设置参数值,在这里设置的值在map,reduce,finalize函数中可见jsMode:boolean      //是否减少执行过程中BSON和JS的转换,默认true]//false时 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可处理非常大的mapreduce,//true时BSON-->js-->map-->reduce-->BSON
                               verbose:boolean     //是否产生更加详细的服务器日志,默认truekeytemp:boolean    //true或false,表明结果输出到的collection是否是临时的,如果为true,则会在客户端连接中断后自动删除,如果你用的是MongoDB的mongo客户端连接,  //那必须exit后才会删除。如果是脚本执行,脚本退出或调用close会自动删除结果collection
}  )
必备参数:map,reduce, out,

详解:

map: function() {emit(this.cat_id,this.goods_number); }, // 函数内部要调用内置的emit函数,cat_id代表根据cat_id来进行分组,goods_number代表把文档中的goods_number字段映射到cat_id分组上的数据,其中this是指向向前的文档的,这里的第二个参数可以是一个对象,如果是一个对象的话,也是作为数组的元素压进数组里面;

reduce: function(cat_id,all_goods_number) {return Array.sum(all_goods_number)}, // cat_id代表着cat_id当前的这一组,all_goods_number代表当前这一组的goods_number集合,这部分返回的就是结果中的value值;

out: <output>, // 输出到某一个集合中,注意本属性来还支持如果输出的集合如果已经存在了,那是替换,合并还是继续reduce? 另外还支持输出到其他db的分片中,具体用到时查阅文档,筛选出现的键名分别是_id和value;

query: <document>, // 一个查询表达式,是先查询出来,再进行mapReduce的

sort: <document>, // 发往map函数前先给文档排序

limit: <number>, // 发往map函数的文档数量上限,该参数貌似不能用在分片模式下的mapreduce

finalize: function(key, reducedValue) {return modifiedObject; }, // 从reduce函数中接受的参数key与reducedValue,并且可以访问scope中设定的变量

scope: <document>, // 指定一个全局变量,能应用于finalize和reduce函数

jsMode: <boolean>, // 布尔值,是否减少执行过程中BSON和JS的转换,默认true,true时BSON-->js-->map-->reduce-->BSON,false时 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可处理非常大的mapreduce。

verbose: <boolean> // 是否产生更加详细的服务器日志,默认true

在集合 orders 中查找 status:"A" 的数据,并根据 cust_id 来分组,并计算 amount 的总和。图解:

下面是我个人的动手实验。

    1. 在logsInfo表数据中,根据logcategory进行分组统计数量。

   2.  db.表名. mapReduce实例:

  3. 查看mapReduce的统计结果:

mapReduce中map函数可以理解为分组, emit里的key为分组依据,value建议用count统计次数。

下面这个例子value为数据库的值耗时慢,达不到效果。

mapReduce中的query参数,一般用来过滤使用。 当满足query的条件时,调用mapReduce。相当于SQL的where条件。 query的语句请看我上篇mongodb的文章,聚合查询中有写道这些条件操作符。

     

转载于:https://www.cnblogs.com/lishuotong/p/7114918.html

mongodb的mapReduce查询相关推荐

  1. MongoDB 进阶-关联查询

    [苏州需要工作的加我QQ,内推介绍费平分] MongoDB 进阶 1.数据库命令 a.命令的工作原理 drop命令,在shell中删除一个集合,执行db.refactor.drop().其实这个函数实 ...

  2. 一篇文章带你搞定 MongoDB 中 MapReduce 使用

    玩过 Hadoop 的小伙伴对 MapReduce 应该不陌生,MapReduce 的强大且灵活,它可以将一个大问题分解为多个小问题,将各个小问题发送到不同的机器上去处理,所有的机器都完成计算后,再将 ...

  3. MongoDB:MapReduce的使用

    文章目录 MongoDB:MapReduce的使用 一.简介 二.MapReduce命令 基本语法 案例 三.runCommand 命令 语法 案例 MongoDB:MapReduce的使用 一.简介 ...

  4. MongoDB中mapReduce的使用

    MongoDB中mapReduce的使用 制作人:全心全意 mapReduce的功能和group by的功能类似,但比group by处理的数据量更大 使用示例: var map = function ...

  5. MongoDB自定义条件查询案例

    MongoDB自定义条件查询案例

  6. MongoDB数据库(5.mongodb的聚合操作以及mongodb的高级查询2)

    聚合aggregate 聚合(aggregate) 是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage) 组成的管道,可以对每个阶段的  管道进行分组.过滤等功能,然后经过一系列的处理, ...

  7. php mongodb 子查询,MongoDB数组子查询elemMatch

    MongoDB数组子查询elemMatch 在 MongoDB数组子查询elemMatch详解 语法 db_name.collection_name.find({field:{$elemMatch:{ ...

  8. 使用MongoDB的MapReduce

    MapReduce是Google在2004年推出的一种软件框架,用于支持对计算机集群中的大数据集进行分布式计算. 您可以从此处阅读有关MapReduce的信息 . MongoDB是用C ++编写的面向 ...

  9. MongoDB中MapReduce介绍与使用

    本文来说下MongoDB中MapReduce介绍与使用 文章目录 概述 概述

  10. MongoDB文档查询操作(三)

    关于MongoDB中的查询,我们已经连着介绍了两篇文章了,本文我们来介绍另外一个查询概念游标. 本文是MongoDB系列的第七篇文章,了解前面的文章有助于更好的理解本文: 1.Linux上安装Mong ...

最新文章

  1. 接口重复提交解决方案
  2. SAP CRM One Order status drop down list generation
  3. SAP UI5 log level
  4. kettle-实现每个分组的前N的数据
  5. linuxoracle查看用户权限_实现Oracle授予用户权限的一个实例
  6. 如何玩转sortablejs-vuedraggable实现表单嵌套拖拽功能
  7. 中国最佳广告创意图片_设计一个系统,以帮助赢得最佳创意
  8. Scala笔记整理(二):Scala数据结构—数组、map与tuple
  9. WEB建站规划之建站目的
  10. ActivityGroup对子Activity的管理
  11. 软件测试常用方法实例与分析
  12. 无线院2018下半年技术教练认证-专业能力测评初试
  13. 北京玉渊潭公园第二十届樱花节
  14. 如何用无监督模型,防范信用卡欺诈?
  15. oracle中begin end的作用,如何在SQL * Plus中使用begin/end运行Oracle查询?
  16. 通过windows官网工具制作win10启动盘并安装win10系统
  17. sshxcute_Java 使用SSH连接Linux 使用passwd命令修改密码
  18. 爬虫之遇到woff字体反爬
  19. 常识——renpy的rpa,rpyc文件解包与反编译
  20. IE内存泄露监测工具sIEve

热门文章

  1. 数据挖掘之关联规则和频繁项集
  2. knowledge_based topic model - 基于知识的主题模型概述
  3. Context Encoding for Semantic Segmentation-CVPR2018【论文理解】
  4. list 删除_算法面试题:一个List,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点!...
  5. python将txt读入矩阵_python读入txt数据,并转成矩阵
  6. ubuntu以安装包方式安装jdk13
  7. C++ string , int 之间相互转换
  8. ruby,gem,rails之间的关系
  9. 第13讲++连接查询和子查询
  10. MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解