MongoDB之aggregate聚合函式應用
阿新 • • 發佈:2018-12-24
萬事看文件切記詳見
前言
公司最近在使用MongoDB作為資料庫儲存,學習應用了MongoDB的使用。作為非關係性資料庫的代表,主要是以文件格式儲存的資料庫,靈活的欄位,收到很多開發人員的喜歡。
本人在使用了一天的MongoDB後感覺確實很方便,程式中不用再去定義實體bean,欄位靈活,可多可少。適合需要儲存大量數,高併發,弱事務的網際網路應用開發,開發方便。
今天總結的是MongoDB之aggregate函式的應用,主要用於資料記錄的分析,例如求和,求平均值,最大最小值,分頁,排序等操作,方便了資料的查詢統計。
需求
開發語言為java
專案中需要統計文章的閱讀次數,最大閱讀時間,平均閱讀時間等。
資料庫文件欄位為:
{
"_id" : "1234567",
"_class" : "com.opinion.bean.QqBean",
"groupName" : "小學中群",
"qqNumber" : 127,
"qqContext" : "一句話",
"period" : 0
}
{
"_id" : "1234568",
"_class" : "com.opinion.bean.QqBean",
"groupName" : "高中群",
"qqNumber" : 128,
"qqContext" : "兩句話",
"period " : 1
}
{
"_id" : "1234569",
"_class" : "com.opinion.bean.QqBean",
"groupName" : "大學群",
"qqNumber" : 129,
"qqContext" : "兩句話",
"period" : 1
}
應用:
public ResultBean getArticleRecordT(){
DBObject query=new BasicDBObject().append("_class","com.opinion.bean.QqBean");
//根據文章id和群id查出該文章閱讀量
int readCount=MongoTemplet.getCollection("qqBean").find(query).count();
//定義匹配函式使用$match
DBObject match=new BasicDBObject().append("$match",query);
//這裡必須定義_id
DBObject total=new BasicDBObject("_id","total");
total.put("sum", new BasicDBObject("$sum","$qqNumber"));
total.put("avg", new BasicDBObject("$avg","$qqNumber"));
total.put("max", new BasicDBObject("$max","$qqNumber"));
//定義統計函式使用$group
DBObject groupFields = new BasicDBObject().append("$group",total);
//aggregate引數是一系列條件
AggregationOutput output=MongoTemplet.getCollection("qqBean").aggregate(match,groupFields);
//返回是一個集合
List<DBObject> iterator= (List<DBObject>) output.results();
for (DBObject dbObject:iterator){
System.out.println(dbObject.get("sum"));
System.out.println(dbObject.get("avg"));
}
Map<String,Object> periodMap=new LinkedHashMap<>();
int period;
for (int i=0;i<=24;i=i+3){
query.put("period",i);
period=MongoTemplet.getCollection("qqBean").find(query).count();
periodMap.put("perid"+i,period);
}
Map<String,Object> map=new HashMap<>();
map.put("qq","1111");
map.put("periodMap",periodMap);
return new ResultBean(map);
}
這樣可以拿到統計總和,平均數,最大值都可以
結果: