介绍

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

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

基本语法

>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示例

> db.col.find()
{ "_id" : ObjectId("56c691ae64799370c0ef3583"), "x" : "a", "status" : "on" }
{ "_id" : ObjectId("56c691af64799370c0ef3584"), "x" : "a", "status" : "on" }
{ "_id" : ObjectId("56c691b064799370c0ef3585"), "x" : "a", "status" : "on" }
{ "_id" : ObjectId("56c691ba64799370c0ef3586"), "x" : "a", "status" : "off" }
{ "_id" : ObjectId("56c691bf64799370c0ef3587"), "x" : "b", "status" : "off" }
{ "_id" : ObjectId("56c691c064799370c0ef3588"), "x" : "b", "status" : "off" }
{ "_id" : ObjectId("56c691c664799370c0ef3589"), "x" : "b", "status" : "on" }

现在找出status=on,按着x分类统计出各自的个数

db.col.mapReduce(
function() { emit(this.x, ); },
function(key, values) { return Array.sum(values) },
{
query: {status:"on"},
out:"post_total",
}
).find()

结果

/* 0 */
{
"_id" : "a",
"value" : "aaa"
} /* 1 */
{
"_id" : "b",
"value" : "a"
}

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

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

MongoDB Map Reduce的更多相关文章

  1. MongoDB Map Reduce(转载)

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

  2. 记一次MongoDB Map&Reduce入门操作

    需求说明 用Map&Reduce计算几个班级中,每个班级10岁和20岁之间学生的数量: 需求分析 学生表的字段: db.students.insert({classid:1, age:14, ...

  3. mongodb Map/reduce测试代码

    private void AccountInfo() { ls.Clear(); DateTime dt = DateTime.Now.Date; IMongoQuery query = Query& ...

  4. 数据库-mongodb-聚合与map reduce

    分组统计:group() 简单聚合:aggregate() 强大统计:mapReduce() Group函数: 1.不支持集群.分片,无法分布式计算 2.需要手写聚合函数的业务逻辑 curr指当前行, ...

  5. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化

    上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...

  6. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  7. filter,map,reduce,lambda(python3)

    1.filter filter(function,sequence) 对sequence中的item依次执行function(item),将执行的结果为True(符合函数判断)的item组成一个lis ...

  8. map reduce

    作者:Coldwings链接:https://www.zhihu.com/question/29936822/answer/48586327来源:知乎著作权归作者所有,转载请联系作者获得授权. 简单的 ...

  9. python基础——map/reduce

    python基础——map/reduce Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Pro ...

随机推荐

  1. [办公自动化]PDF大小不一如何调整

    最近使用acrobat制作PDF,结果里面的内容因为来自不同文件.有的大,有的小. 选择打印pdf,即可调整正常. 附: PDF页码也可以调整为与目录实际页码一致. 思考: 利用pdf进行问卷调研:或 ...

  2. twitter storm源码走读之6 -- Trident Topology执行过程分析

    欢迎转载,转载请注明出处,徽沪一郎. TridentTopology是storm提供的高层使用接口,常见的一些SQL中的操作在tridenttopology提供的api中都有类似的影射.关于Tride ...

  3. 【转载 来自sdnlab】 开放网络没那么简单

    链接:开放网络没那么简单 本文是云杉网络工程师张攀对当前开源网络技术现状的一些思考和探索. 开放网元.释放数据的价值 从2012年开始至今,网络行业明显是O字辈的天下.所有我接触过了解过的组织和项目, ...

  4. Web 在线文件管理器学习笔记与总结(7)重命名文件

    rename($oldname,$newname) 重命名文件或目录 <<<EOF EOF; 使用heredoc 技术,来部分实现界面与代码的准分离 重命名时,需要验证新文件名的合法 ...

  5. Note: RewriteCond规则

    如果文件存在,就直接访问文件,不进行下面的RewriteRule:RewriteCond %{REQUEST_FILENAME} !-f 如果目录存在,就直接访问目录,不进行下面的RewriteRul ...

  6. sqlserver log

    DBCC LOGINFODBCC log('QSSys', TYPE=2)goselect * from sys.fn_dblog(null,null)select [Dirty Pages],[Mi ...

  7. 前端框架Bootstrap的Modal使用Ajax数据源,如何避免数据被缓存

    1.绑定事件,在关闭的时候,直接将数据清除: $("#model").on("hidden.bs.model",function(e){$(this).remo ...

  8. Java中共享设计

    Java中的共享设计的思路是在Java中形成一个对象池,在这个对象池中保存多个对象, 新实例化的对象如果已经在池中定义了,则不再重复新定义,而从池中直接取出继续使用. 例如,对于字符串来说,Java ...

  9. PureBasic—数控编辑框与调节块和进度条

    三个有关上下限问题的控件,它们也是主要控件的组成部分,分别为:SpinGadget()        数控编辑框TrackBarGadget()    调节块控件ProgressBarGadget() ...

  10. ubuntu如何开启root,如何启用Ubuntu中root帐号

    jingyan.baidu.com/article/495ba84116104238b20ede62.html ubuntu如何开启root,如何启用Ubuntu中root帐号 | 浏览:8344 | ...