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'}])
执行结果: