MongoDB——聚合操作之MapReduce

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB——聚合操作之MapReduce相关的知识,希望对你有一定的参考价值。

目录

一、MapReduce的概述

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

二、MapReduce的阶段

  • MapReduce具有两个阶段:
    (1)、将具有相同Key的文档数据整合在一起的map阶段;
    (2)、组合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>,
    		finalize: <function>, 
    		scope: <document>, 
    		jsMode: <boolean>,
    		verbose: <boolean>, 
    		bypassDocumentValidation: <boolean>
    	
    )
    
  • 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、 数据准备

  • 准备数据集,执行脚本

    var tags = ["nosql","mongodb","document","developer","popular"];
    var types = ["technology","sociality","travel","novel","literature"];
    var books=[];
    for(var i=0;i<50;i++)
    	var typeIdx = Math.floor(Math.random()*types.length);
    	var tagIdx = Math.floor(Math.random()*tags.length);
    	var tagIdx2 = Math.floor(Math.random()*tags.length);
    	var favCount = Math.floor(Math.random()*100);
    	var username = "xx00"+Math.floor(Math.random()*10);
    	var age = 20 + Math.floor(Math.random()*15);
    	var book = 
    		title: "book-"+i, 
    		type: types[typeIdx],
    		tag: [tags[tagIdx],tags[tagIdx2]],
    		favCount: favCount, 
    		author: name:username,age:age
    	;
    	books.push(book)
    
    db.books1.insertMany(books);
    

4.2、 MapReduce示例

  • 统计type为travel的不同作者的books文档收藏数

    db.books1.mapReduce( 
    	function()emit(this.author.name,this.favCount), 
    	function(key,values)return Array.sum(values), 
    	 
    		query:type:"travel", 
    		out: "books_favCount" 
    	 
    )
    

  • 由于结果输出到了books_favCount中,所以需要去books_favCount中查看结果

    > db.books_favCount.find()
    

以上是关于MongoDB——聚合操作之MapReduce的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb聚合操作之读书笔记

Mongodb中数据聚合之基本聚合函数countdistinctgroup

MongoDB 聚合操作

MongoDB 聚合操作

MongoDB 聚合操作(转)

Mongodb中数据聚合之聚合管道aggregate