group分组统计是数据库比较常用的功能,mongodb也不例外。不过相对于普通的增删改查,group操作就略微麻烦一些,
这里对group在shell中的操作、使用java原生代码操作以及集成spring进行操作进行一个简单的归纳总结,分组的途径和方法应该都有多种,这里每一样只举一例。

本例中数据源如下:


需要使用group实现的目的是:按年龄分组统计出每一组的数量。

1、mongo shell中执行如下命令:

db.test.group({
    key:{"age":1},
    initial:{"count":0},
   $reduce:function(doc,out){ out.count++; } ,
   $finalize:function(out){ return out; }
 }
 )

执行代码及结果如图:



2、java原生代码进行上述操作:

public class MonTest {
    public static void main(String[] args) {
        monGroup();
    }
    public static void monGroup() {
        ServerAddress sa = new ServerAddress("192.168.0.201", 37017);
        List<MongoCredential> mongoCredentialList = new ArrayList<MongoCredential>();
        mongoCredentialList.add(MongoCredential.createMongoCRCredential("admin", "admin", "123456".toCharArray()));
        Mongo client = new MongoClient(sa, mongoCredentialList);
        DB database = client.getDB("admin");
        DBCollection coll = database.getCollection("test");
        DBObject keys = new BasicDBObject("age", 1);
        DBObject condition = null;
        DBObject initial = new BasicDBObject("count", 0);
        String reduce = "function(doc,out){out.count++;}";
        String finalize = "function(out){return out;}";
        BasicDBList dbList = (BasicDBList) coll.group(keys, condition, initial, reduce, finalize);
        if (dbList != null) {
            for (int i = 0; i < dbList.size(); i++) {
                DBObject obj = (DBObject) dbList.get(i);
                Object age = obj.get("age");
                Object count = obj.get("count");
                System.out.println("age:" + age + ",count:" + count);
            }
        }
    }
}

执行结果如图:


3、集成spring后的操作:


dao方法实现代码:
  /**
     * mongodb简单分组查询
     *
     * @author:tuzongxun
     * @Title: mongoGroup
     * @param @return
     * @date Jul 19, 2016 8:36:19 AM
     * @throws
     */
    @Override
    public BasicDBList mongoGroup() {
        // TODO Auto-generated method stub
        GroupBy groupBy = GroupBy.key("age").initialDocument("{count:0}").reduceFunction("function(doc, out){out.count++}")
            .finalizeFunction("function(out){return out;}");
        GroupByResults<UserModel> res = mongoTemplate.group("test", groupBy, UserModel.class);
        DBObject obj = res.getRawResults();
        BasicDBList dbList = (BasicDBList) obj.get("retval");
        return dbList;
    }

对应的实体model:
package spring_mongo.models;
import java.io.Serializable;
public class UserModel implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public UserModel(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserModel [name=" + name + ", age=" + age + "]";
    }

}

junit测试方法:
@Test
    public void mongoGroup() {
        BasicDBList dbList = userDao.mongoGroup();
        if (dbList != null) {
            for (int i = 0; i < dbList.size(); i++) {
                DBObject obj = (DBObject) dbList.get(i);
                Object age = obj.get("age");
                Object count = obj.get("count");
                System.out.println("age:" + age + ",count:" + count);
            }
        }
    }

运行结果如图:





mongodb命令行group分组和java代码中group分组的更多相关文章

  1. MongoDB命令行操作

    本文专门介绍MongoDB的命令行操作.其实,这些操作在MongoDB官网提供的Quick Reference上都有,但是英文的,为了方便,这里将其稍微整理下,方便查阅. 这里用来做测试的是远端(10 ...

  2. 如何使用命令行编译和运行java文件

    相信大家现在一般都在使用IDE环境来开发运行java文件,但我觉得可以在命令行里面简单运行java文件,技多不压身. 接下来我来说一下编译和运行java文件: 第一步,首先下一个入门程序(注意:一定要 ...

  3. 命令行编译多个java文件

    如何使用命令行编译多个java文件 文件结构: method 1 cd javaproject javac -sourcepath javapath -d classpath javapath/*.j ...

  4. Android color(颜色) 在XML文件和java代码中

    Android color(颜色) 在XML文件和java代码中,有需要的朋友可以参考下. 1.使用Color类的常量,如: int color = Color.BLUE;//创建一个蓝色 是使用An ...

  5. IDEA插件:快速删除Java代码中的注释

    背景   有时,我们需要删除Java源代码中的注释.目前有不少方法,比如: 实现状态机.该方式较为通用,适用于多种语言(取决于状态机支持的注释符号). 正则匹配.该方式容易误判,尤其是容易误删字符串. ...

  6. Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)

    <bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil& ...

  7. 使用mongo-java-driver3.0.2.jar和mongodb3.0在java代码中的用户验证4

    以下是使用mongo-java-driver3.0.2.jar和mongodb3.0.4在java代码中的用户验证: ServerAddress sa = new ServerAddress(host ...

  8. 关于在Java代码中写Sql语句需要注意的问题

    最近做程序,时不时需要自己去手动将sql语句直接写入到Java代码中,写入sql语句时,需要注意几个小问题. 先看我之前写的几句简单的sql语句,自以为没有问题,但是编译直接报错. String st ...

  9. java代码中获取进程process id(转)

    另一方面,线程ID=进程ID+内部线程对象ID并不成立,    参考: blog.csdn.net/heyetina/article/details/6633901     如何在java代码中获取进 ...

随机推荐

  1. CSS——选择器2

    1.子选择器 (1).用于指定标签元素的第一代子元素,使用">"号. (2).例子: <style type="text/css"> .foo ...

  2. [DeeplearningAI笔记]02_3.1-3.2超参数搜索技巧与对数标尺

    Hyperparameter search 超参数搜索 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1 调试处理 需要调节的参数 级别一:\(\alpha\)学习率是最重要的需要调节的 ...

  3. 安装puppeteer

    Puppeteer是一个node库,他提供了一组用来操纵Chrome的API,默认headless也就是无UI的chrome,也可以配置为有UI. 其实有点类似于PhantomJS,但Puppetee ...

  4. aop难点解析。

    静态织入和动态织入的区别? 需求示例:假设有一个包,一个包当中有一个方法,我们想在这个方法的前后,加上环绕. 那么怎么加呢? 把知道的都说一遍. 1.建立JsonService 2.建立JSONASP ...

  5. dlib下训练自己的物体检测器--手的检测

    之前我们在Linux上安装了dlib(http://www.cnblogs.com/take-fetter/p/8318602.html),也成功的完成了之前的人脸检测程序, 今天我们来一起学习怎样使 ...

  6. 数据分区------《Designing Data-Intensive Applications》读书笔记9

    进入到第六章了,我们要开始聊聊分布式系统之中的核心问题:数据分区.分布式系统通常是通过大规模的数据节点来处理单机没有办法处理的海量数据集,因此,可以将一个大型数据集可以分布在多个磁盘上,查询负载可以分 ...

  7. 读Ghost博客源码与自定义Ghost博客主题

    我使用的Ghost博客一直使用者默认的Casper主题.我向来没怎么打理过自己博客,一方面认为自己不够专业,很难写出质量比较高的文字:另一方面认为博客太耗时间,很容易影响正常的工作内容.最近公司即将搬 ...

  8. ext4 关闭延迟分配

    ext4的延迟分配特性(delalloc)保证文件在磁盘中的连续,提高文件的读写性能,但是却增加了丢数据的概率. Hadoop和HBase中建议将延迟分配特性关闭. 可以使用下面的方法关闭延迟分配 1 ...

  9. ehcache memcache redis 三大缓存男高音[转]

    原文链接:http://blog.csdn.net/jationxiaozi/article/details/8509732 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特 ...

  10. Python基础篇(三)

    元组是序列的一种,与列表的区别是,元组是不能修改的. 元组一般是用圆括号括起来进行定义,如下: >>> (1,2,3)[1:2]     (2,) 如果元组中只有一个元素,元组的表示 ...