MongoDB——聚合操作之MapReduce

x33g5p2x  于2022-04-27 转载在 MapReduce  
字(1.9k)|赞(0)|评价(0)|浏览(750)

一、MapReduce的概述

  • MapReduce操作将大量的数据处理工作拆分成多个线程并行处理,然后将结果合并在一起。MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。

二、MapReduce的阶段

  • MapReduce具有两个阶段:
    (1)、将具有相同Key的文档数据整合在一起的map阶段;
    (2)、组合map操作的结果进行统计输出的reduce阶段。

三、MapReduce的基本语法

  • MapReduce语法格式
  1. db.collection.mapReduce(
  2. function() {emit(key,value);}, //map 函数
  3. function(key,values) {return reduceFunction}, //reduce 函数
  4. {
  5. out: <collection>,
  6. query: <document>,
  7. sort: <document>,
  8. limit: <number>,
  9. finalize: <function>,
  10. scope: <document>,
  11. jsMode: <boolean>,
  12. verbose: <boolean>,
  13. bypassDocumentValidation: <boolean>
  14. }
  15. )
  • MapReduce语法解释
函数解释
map将数据拆分成键值对,交给reduce函数
reduce根据键将值做统计运算
out可选,将结果汇入指定表
quey可选筛选数据的条件,筛选的数据送入map
sort排序完后,送入map
limit限制送入map的文档数
finalize可选,修改reduce的结果后进行输出
scope可选,指定map、reduce、finalize的全局变量
jsMode可选,默认false。在mapreduce过程中是否将数 据转换成bson格式。
verbose可选,是否在结果中显示时间,默认false
bypassDocmentValidation可选,是否略过数据校验
  • MapReduce图解

四、MapReduce示例

4.1、 数据准备

  • 准备数据集,执行脚本
  1. var tags = ["nosql","mongodb","document","developer","popular"];
  2. var types = ["technology","sociality","travel","novel","literature"];
  3. var books=[];
  4. for(var i=0;i<50;i++){
  5. var typeIdx = Math.floor(Math.random()*types.length);
  6. var tagIdx = Math.floor(Math.random()*tags.length);
  7. var tagIdx2 = Math.floor(Math.random()*tags.length);
  8. var favCount = Math.floor(Math.random()*100);
  9. var username = "xx00"+Math.floor(Math.random()*10);
  10. var age = 20 + Math.floor(Math.random()*15);
  11. var book = {
  12. title: "book-"+i,
  13. type: types[typeIdx],
  14. tag: [tags[tagIdx],tags[tagIdx2]],
  15. favCount: favCount,
  16. author: {name:username,age:age}
  17. };
  18. books.push(book)
  19. }
  20. db.books1.insertMany(books);

4.2、 MapReduce示例

  • 统计type为travel的不同作者的books文档收藏数
  1. db.books1.mapReduce(
  2. function(){emit(this.author.name,this.favCount)},
  3. function(key,values){return Array.sum(values)},
  4. {
  5. query:{type:"travel"},
  6. out: "books_favCount"
  7. }
  8. )

  • 由于结果输出到了books_favCount中,所以需要去books_favCount中查看结果
  1. > db.books_favCount.find()

相关文章

最新文章

更多