mongdb高級操作(group by )

首先介紹哈方法

/** * 利用java驅動自帶函數分組查詢 *

@param key 用來分組文檔的字段 【group by key】 *

@param cond 執行過濾的條件 【where name=? and age=?】 *

@param initial reduce中使用變量的初始化 * @param reduce reduce(參數:當前文檔和累加器文檔.) *

@param fn 結束後執行函數 *

@return */

 

參考例子1:

group(DBObject key,DBObject cond,DBObject initial,String reduce,String fn ){

             //key:用來分組文檔的字段。和keyf兩者必須有一個 [類似於group by]

             BasicDBObject key = new BasicDBObject(); key.put("optCode", true);

             //執行過濾的條件 [類似於where]

             BasicDBObject[] array={ new BasicDBObject("startTimeLong",

             new BasicDBObject("$gte", startTime)),

             new BasicDBObject("startTimeLong", new BasicDBObject("$lte", endTime)) };

             BasicDBObject cond = new BasicDBObject(); //cond.put("$and",array);

             //initial:reduce中使用變量的初始化

             BasicDBObject initial = new BasicDBObject();

             initial.append("count", 0);

             //reduce(當前文檔和累加器文檔.)

             String reduce = "function(doc, aggr){" + " aggr.count += 1;" + " }";

             String fn = null;            

             dao.group(key, cond, initial, reduce, fn);

 }

 

參考例子2:

 //求總數和平局數

public Double findAverage(String sumField, String groupField, BasicDBObject where)

 {

          // 分組項字段 【group by groupField】

          DBObject key = new BasicDBObject(groupField, null)

         // 結果數據計數器 【select avg,rsdata.sum,rsdata.count 】

          BasicDBObject counter = new BasicDBObject();

         DBObject index = new BasicDBObject();

         index.put("count", 0);

         index.put("sum", 0);

         counter.put("rsdata", index);counter.put("avg", 0);}

         // reduce處理函數

         String procFunction = "function(doc,aggr){" + "aggr.rsdata.sum+=parseFloat(doc." + sumField + ");" + "aggr.rsdata.count+=1;" + "}";

         // 結果處理函數

         String finallyFunction = "function(doc){" + "doc.avg=doc.rsdata.sum/doc.rsdata.count;" + "}";

         BasicDBList rs = (BasicDBList) getCollection().group(key, where, counter, procFunction, finallyFunction);

         if (null != rs && rs.size() > 0)

         {BasicDBObject data = (BasicDBObject) rs.get(0);

         return Double.parseDouble(data.get("avg").toString());} return 0.0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章