Mongodb自身的分组功能有许多限制,如:返回结果集不能超过16M, group操作不会处理超过10000个唯一键等等,所以,常常需要把数据读入到java中进行分组。java分组的示例如下:
/** 
    * keyColumn : new String[]{"xxxName","xxxType"}  
    * condition : 查询条件 ,可为空 
    * initial : 分组统计初始变量,为空时自动为每列提供初始变量 
    * reduce : 记录处理function 
    * finalize : finalize函数,可为空  
    */
    public BasicDBList group(String[] keyColumn, DBObject condition, 
            DBObject initial, String reduce, String finalize) { 
Mongo m=null;
try{
m = new Mongo( "192.168.1.105" , 27017 ); // 指定主机与端口  
} catch (UnknownHostException e) {             
e.printStackTrace();         
} catch (MongoException e) {             
e.printStackTrace();         
}         
DB db = m.getDB( "mydb" ); // 取得指定的库 
DBCollection coll = db.getCollection("myTbl"); //得到指定集合
        DBObject key = new BasicDBObject(); 
        for (int i = 0; i < keyColumn.length; i++) { 
            key.put(keyColumn[i], true); 
        } 
        condition = (condition == null) ? new BasicDBObject() : condition; 
        if (StringUtils.isEmpty(finalize)) { 
            finalize = null; 
        } 
        if (initial == null) {      //定义一些初始变量 
            initial = new BasicDBObject(); 
            for (int i = 0; i < keyColumn.length; i++) { 
                DBObject index = new BasicDBObject(); 
                index.put("count", 0); 
                index.put("sum", 0); 
                index.put("max", 0); 
                index.put("min", 0); 
                index.put("avg", 0); 
                index.put("self", ""); 
                initial.put(keyColumn[i], index); 
            } 
        } 
        BasicDBList resultList = (BasicDBList) coll.group(key, condition, 
                initial, reduce, finalize); 
        return resultList; 
    }
 
 
 
实现案例:
 
//任务统计 
//    @Action(value = "getTaskStatistic", results = { @Result(name = "success", type = "json", params = { 
//            "includeProperties", "jsonResult" }) }) 
    public String getTaskStatistic() { 
        DBObject initial = new BasicDBObject(); 
        DBObject index = new BasicDBObject(); 
        index.put("count", 0); 
        index.put("taskStatus", ""); 
        initial.put("taskStatus", index); 
                      
        String reduce = "function (doc, out) { "
                    + " out.taskStatus.count = out.taskStatus.count+=1; "
                    + " out.taskStatus.inspectStatus = doc.taskStatus;"
                + "}"; 
        BasicDBList group = (BasicDBList)group(new String[] { "taskStatus"}, null, initial, reduce, null); 
                      
        return group.toString(); 
        
    }
 
返回数据:
[ { "taskStatus" : { "count" : 4.0 , "taskStatus" : "Finished"}} , { "taskStatus" : { "count" : 3.0 , "taskStatus" : "Received"}} , { "taskStatus" : { "count" : 2.0 , "taskStatus" : "UnReceive"}}]实际上完全是在用java写分组了,所以非常麻烦,而Mongo自己的分组又限制太多,可以用润乾公司的集算器来完成这个工作,集算器提供了许多常用的结构化数据计算功能,相当于把本来要用java写的代码都写好了,直接用就可以。
如果用它读出Mongodb的数据,则分组变得非常简单,只需要一句代码即可完成,如:T.groups(colname;sum(colname):F1,count(1):F2)。而且集算器提供了JDBC式的访问接口,很容易集成到java主程序中。