MongoDB JAVA-API执行mapreduce的几种方法

转载自:http://my.oschina.net/huzorro/blog/75210

1 > db.version();
2 1.6.3


1 mongodb-2.0.jar


01 <!--
02 #shell下完整的参数列表
03 #更高版本会多几个参数
04 //-->
05 db.runCommand( 
06
07     mapreduce : <collection>, 
08     map : <mapfunction>, 
09     reduce : <reducefunction> 
10     [, query : <query filter object>] 
11     [, sort : <sort the query.  useful   optimization>] for 
12     [, limit : <number of objects to   from collection>] return 
13     [, out : <output-collection name>] 
14     [, keeptemp: < | >] true false 
15     [, finalize : <finalizefunction>] 
16     [, scope : <object where fields go into javascript global scope >] 
17     [, verbose :  ] true 
18 });


1 //JAVA-API中可以执行mapreduce的方法
2 //该方法只允许携带4个参数
3 public MapReduceOutput mapReduce(String map, String reduce,
4                                 String outputCollection,
5                                 DBObject query)
6                                 throws MongoException
7 //以下两个方法可以使用全部参数列表
8 public MapReduceOutput mapReduce(DBObject command) throws MongoException
9 public CommandResult command(DBObject cmd) throws MongoException


 

01 <!--
02 #shell mapreduce
03 //-->
04 res = db.runCommand({
05     mapreduce:'mo_log_201208',
06     query:{Logtime:{$gte:'20120823', $lte:'20120824'}},
07     map:function() {
08         emit({Spcode:this.Spcode, Spname:this.Spname,
09                 Consignid:this.Consignid, Consname:this.Consname,
10                 Region:this.Region, Regionname:this.Regionname,
11                 Serviceid:this.Serviceid,   
12                 Servicename:this.Servicename,
13                 Srctermid:this.Srctermid}, {count:1});
14     },
15     reduce:function(key, value) {
16         var ret = {count:0};
17         ret.count++;
18         return ret;
19     },
20     out:'tmp_mo_spcode_consignid_region_serviceid_201208_1'
21 })
01 //JAVA-API mapreduce
02     Mongo db = new Mongo("host", "port");
03     DBCollection dbc = db.getCollection("mo_log_201208");
04     String mapfun = "function() {" +
05         "emit({Spcode:this.Spcode, Spname:this.Spname, " +
06                 "Consignid:this.Consignid, Consname:this.Consname, " +
07                 "Region:this.Region, Regionname:this.Regionname, " +
08                 "Serviceid:this.Serviceid, " +  
09                 "Servicename:this.Servicename, " +
10                 "Srctermid:this.Srctermid}, {count:1});" +
11                 "}";
12     String reducefun = "function(key, value) {" +
13         "var ret = {count:0};" +
14         "ret.count++;" +
15         "return ret;" +
16         "}";
17     DBObject query = new BasicDBObject("Logtime",
18                         new BasicDBObject("$gte", "20120823").append("$lte", "20120824"));
19     MapReduceOutput mro = dbc.mapReduce(mapfun, reducefun,
20                             "tmp_mo_spcode_consignid_region_serviceid_201208_1", query);
01 <!--
02 #该mapreduce比上一个多了两个参数
03 //-->
04 res = db.runCommand({
05     mapreduce:'mo_log_201208',
06     query:{Logtime:{$gte:'20120823', $lte:'20120824'}},
07     map:function() {
08         emit({Spcode:this.Spcode, Spname:this.Spname,
09         Consignid:this.Consignid, Consname:this.Consname,
10         Region:this.Region, Regionname:this.Regionname,
11         Serviceid:this.Serviceid, Servicename:this.Servicename,
12         Srctermid:this.Srctermid}, {count:1});
13     },
14     reduce:function(key, value) {
15         var ret = {count:0};
16         ret.count++;
17         return ret;
18     },
19     finalize:function(key, value){
20         db.tmp_mo_spcode_consignid_region_serviceid_201208.insert({"_id":key, "value":value});
21         return value;
22     },
23     out:'tmp_mo_spcode_consignid_region_serviceid_201208_1',
24     verbose:true
25 })
01 //JAVA-API mapreduce
02     Mongo db = new Mongo("host", "port");
03     DBCollection dbc = db.getCollection("mo_log_201208");
04     String mapfun = "function() {" +
05         "emit({Spcode:this.Spcode, Spname:this.Spname, " +
06                 "Consignid:this.Consignid, Consname:this.Consname, " +
07                 "Region:this.Region, Regionname:this.Regionname, " +
08                 "Serviceid:this.Serviceid, " +  
09                 "Servicename:this.Servicename, " +
10                 "Srctermid:this.Srctermid}, {count:1});" +
11                 "}";
12     String reducefun = "function(key, value) {" +
13         "var ret = {count:0};" +
14         "ret.count++;" +
15         "return ret;" +
16         "}";
17     String finalizefun = "function(key, value){" +
18         "db.tmp_mo_spcode_consignid_region_serviceid_201208.insert({"_id":key, "value":value});" +
19         "return value;" +
20         "}";
21     DBObject query = new BasicDBObject("Logtime",
22                         new BasicDBObject("$gte", "20120823").append("$lte", "20120824"));
23     DBObject command = new BasicDBObject();
24     command.put("mapreduce", "mo_log_201208");
25     command.put("query", query);
26     command.put("map", mapfun);
27     command.put("reduce", reducefun);
28     command.put("finalize", finalizefun);
29     command.put("out", "tmp_mo_spcode_consignid_region_serviceid_201208_1");
30     command.put("verbose", true);
31     //在dbcollection上执行mapreduce
32     MapReduceOutput mro = dbc.mapReduce(command);
33     //在db上使用command执行mapreduce
34     CommandResult cr = db.command(command);


>>以上3种方法都可以执行mapreduce, 参数和返回结果各不相同, 根据自己的需要和使用习惯选择合适的方法
>>新版的Mongodb增加了新的聚合框架, 有更多的参数选择, 参见Aggregation Framework


你可能感兴趣的:(mapreduce,mongodb)