1. 程式人生 > >MongoDB之aggregate聚合函式應用

MongoDB之aggregate聚合函式應用

萬事看文件切記詳見

大牛部落格:詳見
優秀部落格:詳見

前言

公司最近在使用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); }

這樣可以拿到統計總和,平均數,最大值都可以
結果:
這裡寫圖片描述