万事看文档切记详见
前言
公司最近在使用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);
}
这样可以拿到统计总和,平均数,最大值都可以
结果: