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}})
浙公网安备 33010602011771号