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的工作步骤做个简单记录:

  1. 对collection进行查询。
  2. 对查询结果使用map函数进行处理,在map方法中至少要调用一次内置函数emit,该函数需要两个参数。第一个是参数key,可以理解为关系数据库查询中的group by的字段,第二个是参数是value,也就是要进行聚合操作的字段。emit的作用是根据key,把value组合为一个数组,为reduce提供输入参数值。
      • 例:
        m = function(){
        	if (this.userid==123){
        		emit(this.userid, this.money)
        	}
        }
  3. 执行reduce处理,reduce需要两个参数,第一个参数是key,第二个参数是value数组,也就是上一步中产生的结果。在这个函数里进行聚合处理,并返回处理后的对象。
    1. 例:
      r = function(key, values){
      	var sum = 0;
      	for (var i = 0; i < values.length; i ++)
      	{
      		sum += values[i];
      	}
      	return {userid : key, sum : sum};
      }
  4. 对上一步的结果进行finalize处理。
  5. 把结果输出到out指定的目标。(v1.7以上版本可以指定out:{inline : 1} 直接返回结果集)
db.users.mapReduce(m, r, {out : {inline : 1}})
posted on 2011-03-28 14:49  ideas  阅读(2326)  评论(0编辑  收藏  举报