db.runCommand( { mapreduce : <collection>, map : <mapfunction>, reduce : <reducefunction> [, query : <query filter object>] [, sort : <sort the query. useful for optimization>] [, 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 >] [, verbose : true] } );
这两天小小的学习了一下MongoDB,关于MapReduce的介绍就不再多说,可以参考官方文档:http://www.mongodb.org/display/DOCS/MapReduce,使用示例可以看这里:https://github.com/mongodb/mongo/blob/master/jstests/mr5.js,这里仅从个人理解角度对MapReduce的工作步骤做个简单记录:
- 对collection进行查询。
- 对查询结果使用map函数进行处理,在map方法中至少要调用一次内置函数emit,该函数需要两个参数。第一个是参数key,可以理解为关系数据库查询中的group by的字段,第二个是参数是value,也就是要进行聚合操作的字段。emit的作用是根据key,把value组合为一个数组,为reduce提供输入参数值。
- 例:
m = function(){ if (this.userid==123){ emit(this.userid, this.money) } }
- 执行reduce处理,reduce需要两个参数,第一个参数是key,第二个参数是value数组,也就是上一步中产生的结果。在这个函数里进行聚合处理,并返回处理后的对象。
- 例:
r = function(key, values){ var sum = 0; for (var i = 0; i < values.length; i ++) { sum += values[i]; } return {userid : key, sum : sum}; }
- 对上一步的结果进行finalize处理。
- 把结果输出到out指定的目标。(v1.7以上版本可以指定out:{inline : 1} 直接返回结果集)
db.users.mapReduce(m, r, {out : {inline : 1}})