MongoDB MapReduce简介


  • Lv 1

    一、概述

    使用MongoDB的MapReduce计算是要实现两个函数(Map函数和Reduce函数,都是JS函数):

    Map函数调用emit(key,value)遍历一个或多个集合中所有的记录,生成键值对序列,作为Reduce函数的参数;

    Reduce函数就是把Map函数的输出再做一个合并简化然后再输出最后的结果。

    二、MapReduce()

    1、基本语法

    db.col.mapReduce(  
            map:Map()函数 function() {emit(key,value);},
            reduce:Reduce函数()  function(key,values) {return reduceFunction},
            {  
                query:  查询条件
                out:  指定输出结果存放到的集合 
                sort:  排序
                limit: 文档数据限制  
                finalize: 这里使用键值对函数对reduce结果再做进一步处理  
                scope: 指定文档范围    
                jsMode:数据是否转换Bason格式,默认false不转换      
                verbose:是否在结果集中包含timeMillis信息,默认true包含     
            }  
        )

    2、范例

    MongoDB Enterprise > db.test4.find()
    { "_id" : ObjectId("5b1b1c29637751cda1184313"), "no" : "F1", "name" : "Jack", "age" : 30 }
    { "_id" : ObjectId("5b1b1c3d637751cda1184314"), "no" : "F2", "name" : "Jack", "age" : 20 }
    { "_id" : ObjectId("5b1b1c59637751cda1184315"), "no" : "F3", "name" : "Lucy", "age" : 22 }
    { "_id" : ObjectId("5b1b1c73637751cda1184316"), "no" : "F4", "name" : "Lucy", "age" : 24 }
    { "_id" : ObjectId("5b1b1c9c637751cda1184317"), "no" : "F5", "name" : "lily", "age" : 18 }
    { "_id" : ObjectId("5b1b1d23637751cda1184318"), "no" : "F6", "name" : "lily", "age" : 20 }
    MongoDB Enterprise > db.test4.mapReduce(function(){emit(this.name,1);},function(key,values){return Array.sum(values)},{query:{age:20},out:"test_res"})
    {
        "result" : "test_res",
        "timeMillis" : 414,
        "counts" : {
            "input" : 2,
            "emit" : 2,
            "reduce" : 0,
            "output" : 2
        },
        "ok" : 1 //1表示执行成功
    }
    

    3、输出结果参数说明

    a、result:把输出结果存到指定的集合上

    b、timeMillis:执行时间

    c、input:输出到map函数上的个数

    d、emit:Map函数上调用emit函数的次数

    e、output: 指定输出集合中文档的数量

    4、查看指定输出集合的结果

    MongoDB Enterprise > db.test4.mapReduce(function(){emit(this.name,1);},function(key,values){return Array.sum(values)},{query:{age:20},out:"test_res"}).find()
    { "_id" : "Jack", "value" : 1 }
    { "_id" : "lily", "value" : 1 }

    根据上面使用mapReduce函数指定输出集合的结果我们可以看出

    result:test_res  //指定结果输出到集合test_res上面

    timeMillis:414   //执行所耗时间414毫秒

    input:2   //test4集合中有2笔记录满足条件输出到map函数上

    emit:2  //emit函数被调用2次

    output:2  //输出test_res集合中有两个文档

    三、总结

    MongoDB的MapReduc是一种计算模型,用于对大规模数据量的分析和统计,可能看起来语法上会复杂一些,但用法比aggregate更加灵活。

    有一点需要注意是,在大数据量的统计下,要确保query是可以利用到索引的,不然计算也是会很慢的。


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待