mongodb 聚合(Map-Reduce)

  介绍

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

    MongoDB中的MapReduce主要有以下几阶段:

    1、Map:把一个操作Map到集合中的每一个文档

    2、Shuffle: 根据Key分组对文档,并且为每个不同的Key生成一系列(>=1个)的值表(List of values)。

    3、Reduce: 处理值表中的元素,直到值表中只有一个元素。然后将值表返回到Shuffle过程,循环处理,直到每个Key只对应一个值表,并且此值表中只有一个元素,这就是MR的结果。

    4、Finalize:此步骤不是必须的。在得到MR最终结果后,再进行一些数据“修剪”性质的处理。

    

 

  处理过程

  

db.runCommand({ 
    mapreduce:<collection>, 
    map:<mapfunction>,
    reduce:<reducefunction>,
    [,query:<query filter object>]
    [,sort:<sorts the input objects using this key.Useful for optimization,like sorting by the emit key for fewer reduces>]
    [,limit:<number of objects to return from collection>]
    [,out:<see output options below>]
    [,keeptemp:<true|false>]
    [,finalize:<finalizefunction>]
    [,scope:<object where fields go into javascript global scope>]
    [, jsMode : boolean,default true]
    [,verbose:true]
});

  参数说明:

  • Mapreduce:要操作的目标集合

  • Map:映射函数(生成键值对序列,作为reduce函数参数)

  • Reduce:统计函数

  • Query:目标记录过滤

  • Sort:目标记录排序

  • Limit:限制目标记录数量

  • Out:统计结果存放集合(不指定使用临时集合,在客户端断开后自动删除)

  • Keeptemp:是否保留临时集合

  • Finalize:最终处理函数(对reduce返回结果进行最终整理后存入结果集合)

  • Scope:向map、reduce、finalize导入外部变量

  • jsMode说明:为false时 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可处理非常大的mapreduce,为true时 BSON-->js-->map-->reduce-->BSON

  • Verbose:显示详细的时间统计信息

  

  执行查询的步骤

  • MapReduce对指定的集合Collection进行查询

  • 对A的结果集进行mapper方法采集

  • 对B的结果执行finalize方法处理

  • 最终结果集输出到临时Collection中

  • 断开连接,临时Collection删除或保留

  以下是来自文档的图,可以清楚的说明 Map-Reduce 的执行过程。 

  

  

    MongoDB中使用emit函数向MapReduce提供Key/Value对。

    Reduce函数接受两个参数:Key,emits. Key即为emit函数中的Key。 emits是一个数组,它的元素就是emit函数提供的Value。

    Reduce函数的返回结果必须要能被Map或者Reduce重复使用,所以返回结果必须与emits中元素结构一致。

    Map或者Reduce函数中的this关键字,代表当前被Mapping文档。

 

 

  构造数据:

  

db.orders.insertMany([{cust_id:'A123',amount:500,status:'A'},
{cust_id:'A123',amount:250,status:'A'},
{cust_id:'B212',amount:200,status:'A'},
{cust_id:'A123',amount:100,status:'D'}])

  执行结果:

  

 

posted on 2020-12-29 16:39  shaomine  阅读(867)  评论(0编辑  收藏  举报