Map-reduce是一种数据处理范例,用于将大量数据压缩为有用的聚合结果。 对于map-reduce操作,MongoDB提供了mapReduce数据库命令。

一个简单的map-reduce示例如下:

在此map-reduce操作中,MongoDB将映射(map)操作应用于每个输入文档(即集合中与查询条件匹配的文档)。map函数提交(emit)一个键值对(key-value)。对于具有多个值的key钥,MongoDB应用reduce操作,该操作用于聚合数据。然后MongoDB将结果存储在一个集合中。reduce函数的输出还可以选择通过finalize函数以进一步压缩或处理聚合的结果。

MongoDB中的所有map-reduce函数都是JavaScript,并在mongod进程中运行。 Map-reduce操作将单个集合的文档作为输入,并可在开始映射阶段之前执行任意排序和限制。 mapReduce可以将map-reduce操作的结果作为文档返回,也可以将结果写入集合。 输入和输出集合可以分片。

对于大多数聚合操作,聚合管道( Aggregation Pipeline)[https://docs.mongodb.com/manual/core/aggregation-pipeline/]提供更好的性能和更一致的接口。 但是,map-reduce操作提供了一些目前在聚合管道中不可用的灵活性。

Map-Reduce JavaScript 函数

在MongoDB中,map-reduce操作使用自定义JavaScript函数将值(value)映射或关联到键(key)。 如果某个键(key)有对应多个值(value),则该操作应该将键的值reduces单个对象

使用自定义JavaScript函数可以灵活地进行map-reduce操作。 例如,在处理文档时,map函数可以创建多个键和值映射或不进行映射。 Map-reduce操作还可以使用自定义JavaScript函数对映射的结果进行最终修改,并在映射操作的最后阶段进行reduce操作,执行其他计算。

Map-Reduce 行为

在MongoDB中,map-reduce操作可以将结果写入集合或返回结果内联。 如果将map-reduce输出写入集合,则可以在合并替换,合并或减少新结果与先前结果的同一输入集合上执行后续map-reduce操作。 有关详细信息和示例,请参阅mapReducePerform Incremental(执行增量) Map-Reduce

当返回map-reduce操作的内联结果时,结果文档必须在BSON文档大小限制内,该限制当前为16兆字节。 有关map-reduce操作的限制和限制的其他信息,请参阅mapReduce参考页面。

MongoDB支持分片集合上的map-reduce操作。 Map-reduce操作还可以将结果输出到分片集合。 请参见Map-Reduce and Sharded Collections

Views(视图)不支持map-reduce操作。

一个简单的测试

MongoDB地理空间数据存储及检索

上面链接是之前曾经做过一个全国县级行政边界矢量入库到MongoDB的记录,这里用它来测试一下。

简单的测试一下全国每个省都有多少个县

  1. db.getCollection('xzbj').mapReduce(
  2. function() { emit(this.properties.sheng,1);},
  3. function(key,values){return Array.sum(values);},
  4. {
  5. query:{},
  6. out:"xian_count"
  7. }
  8. )

这里将结果输出到了xian_count这个新的集合中,可以打开这个集合查看结果。

上面的query也可以没有,就是默认集合内全部文档。

如果不想把结果输出到一个集合,直接显示结果,则可以使用out: { inline: 1 }

计算一下湖南省每个地级市有多少个县

使用下面语句

  1. db.getCollection('xzbj').mapReduce(
  2. function() { emit(this.properties.di,1);},
  3. function(key,values){return Array.sum(values);},
  4. {
  5. query:{ 'properties.sheng':'湖南'},
  6. out: { inline: 1 }
  7. }
  8. )

得到输出如下(这里如果是针对全国的数据是有问题的,因为之前没有正确处理港澳台数据):

  1. {
  2. "results" : [
  3. {
  4. "_id" : "娄底市",
  5. "value" : 5.0
  6. },
  7. {
  8. "_id" : "岳阳市",
  9. "value" : 7.0
  10. },
  11. {
  12. "_id" : "常德市",
  13. "value" : 9.0
  14. },
  15. {
  16. "_id" : "张家界市",
  17. "value" : 3.0
  18. },
  19. {
  20. "_id" : "怀化市",
  21. "value" : 12.0
  22. },
  23. {
  24. "_id" : "株洲市",
  25. "value" : 6.0
  26. },
  27. {
  28. "_id" : "永州市",
  29. "value" : 10.0
  30. },
  31. {
  32. "_id" : "湘潭市",
  33. "value" : 4.0
  34. },
  35. {
  36. "_id" : "湘西土家族苗族自治州",
  37. "value" : 8.0
  38. },
  39. {
  40. "_id" : "益阳市",
  41. "value" : 6.0
  42. },
  43. {
  44. "_id" : "衡阳市",
  45. "value" : 8.0
  46. },
  47. {
  48. "_id" : "邵阳市",
  49. "value" : 11.0
  50. },
  51. {
  52. "_id" : "郴州市",
  53. "value" : 11.0
  54. },
  55. {
  56. "_id" : "长沙市",
  57. "value" : 5.0
  58. }
  59. ],
  60. "timeMillis" : 19.0,
  61. "counts" : {
  62. "input" : 105,
  63. "emit" : 105,
  64. "reduce" : 14,
  65. "output" : 14
  66. },
  67. "ok" : 1.0,
  68. "_o" : {
  69. "results" : [
  70. {
  71. "_id" : "娄底市",
  72. "value" : 5.0
  73. },
  74. {
  75. "_id" : "岳阳市",
  76. "value" : 7.0
  77. },
  78. {
  79. "_id" : "常德市",
  80. "value" : 9.0
  81. },
  82. {
  83. "_id" : "张家界市",
  84. "value" : 3.0
  85. },
  86. {
  87. "_id" : "怀化市",
  88. "value" : 12.0
  89. },
  90. {
  91. "_id" : "株洲市",
  92. "value" : 6.0
  93. },
  94. {
  95. "_id" : "永州市",
  96. "value" : 10.0
  97. },
  98. {
  99. "_id" : "湘潭市",
  100. "value" : 4.0
  101. },
  102. {
  103. "_id" : "湘西土家族苗族自治州",
  104. "value" : 8.0
  105. },
  106. {
  107. "_id" : "益阳市",
  108. "value" : 6.0
  109. },
  110. {
  111. "_id" : "衡阳市",
  112. "value" : 8.0
  113. },
  114. {
  115. "_id" : "邵阳市",
  116. "value" : 11.0
  117. },
  118. {
  119. "_id" : "郴州市",
  120. "value" : 11.0
  121. },
  122. {
  123. "_id" : "长沙市",
  124. "value" : 5.0
  125. }
  126. ],
  127. "timeMillis" : 19,
  128. "counts" : {
  129. "input" : 105,
  130. "emit" : 105,
  131. "reduce" : 14,
  132. "output" : 14
  133. },
  134. "ok" : 1.0
  135. },
  136. "_keys" : [
  137. "results",
  138. "timeMillis",
  139. "counts",
  140. "ok"
  141. ],
  142. "_db" : {
  143. "_mongo" : {
  144. "slaveOk" : true,
  145. "host" : "127.0.0.1:27017",
  146. "defaultDB" : "test",
  147. "_readMode" : "commands"
  148. },
  149. "_name" : "us"
  150. }
  151. }

MongoDB下Map-Reduce使用简单翻译及示例的更多相关文章

  1. map/reduce类简单介绍

    在Hadoop的mapper类中,有4个主要的函数,分别是:setup,clearup,map,run.代码如下: protected void setup(Context context) thro ...

  2. 入门大数据---Map/Reduce,Yarn是什么?

    简单概括:Map/Reduce是分布式离线处理的一个框架. Yarn是Map/Reduce中的一个资源管理器. 一.图形说明下Map/Reduce结构: 官方示意图: 另外还可以参考这个: 流程介绍: ...

  3. MongoDB Map Reduce(转载)

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

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

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

  5. ODPS 下一个map / reduce 准备

    阿里接到一个电话说练习和比赛智能二选一, 真的很伤心, 练习之前积极老龄化的权利. 要总结ODPS下一个 写map / reduce 并进行购买预测过程. 首先这里的hadoop输入输出都是表的形式, ...

  6. mongodb Map/reduce测试代码

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

  7. 分布式基础学习(2)分布式计算系统(Map/Reduce)

    二. 分布式计算(Map/Reduce) 分 布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件 系统,很 ...

  8. 分布式基础学习【二】 —— 分布式计算系统(Map/Reduce)

    二. 分布式计算(Map/Reduce) 分布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件系统,很大程 ...

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

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

随机推荐

  1. miniui中可以设置是否让页面进行分页 <div id="datagrid1" class="mini-datagrid" style="width:100%" allowAlternating="true" showpager="true"/> 就是设置showpager属性为true

    <div id="datagrid1" class="mini-datagrid" style="width:100%" allowA ...

  2. JVM五大知识点

    1 JVM的基本特性 1.1 基于栈(Stack-based): 不同于Intel x86和ARM等比较流行的计算机处理器都是基于寄存器(register)架构,JVM是基于栈执行的. 1.2 符号引 ...

  3. C# 控制左右声道

    private void button1_Click(object sender, EventArgs e) { axWindowsMediaPlayer1.settings.balance = -; ...

  4. XamarinAndroid组件教程设置自定义子元素动画(二)

    XamarinAndroid组件教程设置自定义子元素动画(二) (9)打开MainActivity.cs文件,为RecylerView的子元素设置添加和删除时的透明动画效果.代码如下: …… usin ...

  5. 在eclipse中配置Python环境

    1.下载pydev https://sourceforge.net/projects/pydev/files/pydev/PyDev%202.2.2/ 2.解压pydev插件后 有features.p ...

  6. [C程序设计基础]一些常用的系统函数

  7. 在Qt中调用Mupdf库进行pdf显示

    2018.5.10 更新内存对齐说明 感谢知乎网友@孤独子狮 指出QImage处需要考虑内存对齐的问题.因为本人缺乏跨平台.图形库开发经验,所以在调试成功后就没有深入探究. 主要修改了QImage的构 ...

  8. BZOJ.4558.[JLOI2016]方(计数 容斥)

    BZOJ 洛谷 图基本来自这儿. 看到这种计数问题考虑容斥.\(Ans=\) 没有限制的正方形个数 - 以\(i\)为顶点的正方形个数 + 以\(i,j\)为顶点的正方形个数 - 以\(i,j,k\) ...

  9. ns2.34 移植MFLOOD协议时出现的问题

    安全按照<NS网络模拟核协议仿真>第11章的步骤进行修改,但是make的时候出现了一下错误: make[1]: 正在进入目录 `/home/wang/ns/ns-allinone-2.34 ...

  10. C语言基础三(敲打键盘、寻找资料,循环语句)

    有人在学C语言或者其他语言的时候,大家都会说逻辑思维的硬道理,认为没有逻辑思维的人走不远,那么小编这里借助简单的if...else... 英文解释if(如果),else(否则) ----------- ...