> db.version(); 1.6.3
mongodb-2.0.jar
<!-- #shell下完整的参数列表 #更高版本会多几个参数 //--> db.runCommand( { mapreduce : <collection>, map : <mapfunction>, reduce : <reducefunction> [, query : <query filter object>] [, sort : <sort the query. useful optimization>] for [, limit : <number of objects to from collection>] return [, out : <output-collection name>] [, keeptemp: < | >] true false [, finalize : <finalizefunction>] [, scope : <object where fields go into javascript global scope >] [, verbose : ] true });
//JAVA-API中可以执行mapreduce的方法 //该方法只允许携带4个参数 public MapReduceOutput mapReduce(String map, String reduce, String outputCollection, DBObject query) throws MongoException //以下两个方法可以使用全部参数列表 public MapReduceOutput mapReduce(DBObject command) throws MongoException public CommandResult command(DBObject cmd) throws MongoException
<!-- #shell mapreduce //--> res = db.runCommand({ mapreduce:'mo_log_201208', query:{Logtime:{$gte:'20120823', $lte:'20120824'}}, map:function() { emit({Spcode:this.Spcode, Spname:this.Spname, Consignid:this.Consignid, Consname:this.Consname, Region:this.Region, Regionname:this.Regionname, Serviceid:this.Serviceid, Servicename:this.Servicename, Srctermid:this.Srctermid}, {count:1}); }, reduce:function(key, value) { var ret = {count:0}; ret.count++; return ret; }, out:'tmp_mo_spcode_consignid_region_serviceid_201208_1' })
//JAVA-API mapreduce Mongo db = new Mongo("host", "port"); DBCollection dbc = db.getCollection("mo_log_201208"); String mapfun = "function() {" + "emit({Spcode:this.Spcode, Spname:this.Spname, " + "Consignid:this.Consignid, Consname:this.Consname, " + "Region:this.Region, Regionname:this.Regionname, " + "Serviceid:this.Serviceid, " + "Servicename:this.Servicename, " + "Srctermid:this.Srctermid}, {count:1});" + "}"; String reducefun = "function(key, value) {" + "var ret = {count:0};" + "ret.count++;" + "return ret;" + "}"; DBObject query = new BasicDBObject("Logtime", new BasicDBObject("$gte", "20120823").append("$lte", "20120824")); MapReduceOutput mro = dbc.mapReduce(mapfun, reducefun, "tmp_mo_spcode_consignid_region_serviceid_201208_1", query);
<!-- #该mapreduce比上一个多了两个参数 //--> res = db.runCommand({ mapreduce:'mo_log_201208', query:{Logtime:{$gte:'20120823', $lte:'20120824'}}, map:function() { emit({Spcode:this.Spcode, Spname:this.Spname, Consignid:this.Consignid, Consname:this.Consname, Region:this.Region, Regionname:this.Regionname, Serviceid:this.Serviceid, Servicename:this.Servicename, Srctermid:this.Srctermid}, {count:1}); }, reduce:function(key, value) { var ret = {count:0}; ret.count++; return ret; }, finalize:function(key, value){ db.tmp_mo_spcode_consignid_region_serviceid_201208.insert({"_id":key, "value":value}); return value; }, out:'tmp_mo_spcode_consignid_region_serviceid_201208_1', verbose:true })
//JAVA-API mapreduce Mongo db = new Mongo("host", "port"); DBCollection dbc = db.getCollection("mo_log_201208"); String mapfun = "function() {" + "emit({Spcode:this.Spcode, Spname:this.Spname, " + "Consignid:this.Consignid, Consname:this.Consname, " + "Region:this.Region, Regionname:this.Regionname, " + "Serviceid:this.Serviceid, " + "Servicename:this.Servicename, " + "Srctermid:this.Srctermid}, {count:1});" + "}"; String reducefun = "function(key, value) {" + "var ret = {count:0};" + "ret.count++;" + "return ret;" + "}"; String finalizefun = "function(key, value){" + "db.tmp_mo_spcode_consignid_region_serviceid_201208.insert({"_id":key, "value":value});" + "return value;" + "}"; DBObject query = new BasicDBObject("Logtime", new BasicDBObject("$gte", "20120823").append("$lte", "20120824")); DBObject command = new BasicDBObject(); command.put("mapreduce", "mo_log_201208"); command.put("query", query); command.put("map", mapfun); command.put("reduce", reducefun); command.put("finalize", finalizefun); command.put("out", "tmp_mo_spcode_consignid_region_serviceid_201208_1"); command.put("verbose", true); //在dbcollection上执行mapreduce MapReduceOutput mro = dbc.mapReduce(command); //在db上使用command执行mapreduce CommandResult cr = db.command(command);
>>以上3种方法都可以执行mapreduce, 参数和返回结果各不相同, 根据自己的需要和使用习惯选择合适的方法
>>新版的Mongodb增加了新的聚合框架, 有更多的参数选择, 参见Aggregation Framework