首先介紹哈方法
參考例子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;
}