欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MongoDB之aggregate聚合函数应用实例讲解

程序员文章站 2022-03-02 17:27:43
前言 公司最近在使用mongodb作为存储,学习应用了mongodb的使用。作为非关系性数据库的代表,主要是以文档格式存储的数据库,灵活的字段,收到很多开发人员的喜欢。 本人在使用了一天的mongo...

前言

公司最近在使用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 iterator= (list) output.results();
        for (dbobject dbobject:iterator){
            system.out.println(dbobject.get("sum"));
            system.out.println(dbobject.get("avg"));
        }
        map 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 map=new hashmap<>();
        map.put("qq","1111");
        map.put("periodmap",periodmap);
        return new resultbean(map);
    }

这样可以拿到统计总和,平均数,最大值都可以

结果:

MongoDB之aggregate聚合函数应用实例讲解