文章目录

  • 1. 插入一条数据 insert()
  • 2. 插入一条数据 save()
  • 3. 批量插入 insert()
  • 4. 批量插入 insertAll()
  • 5. 更新查询结果的第一个值 updateFirst()
  • 6. 更新所有查询结果 updateMulti()
  • 7. 数据库有就修改查询出的第一条,数据库没有就新增一条 upsert()
  • 8. 删除符合条件的记录 remove()
  • 9. 查询出符合条件的结果,并将符合条件的数据删除,只会删除第一条 findAndRemove()
  • 10. 查询出符合条件的所有结果,并将符合条件的所有数据删除 findAllAndRemove()
  • 11. 查询集合中所有数据,不加条件 findAll()
  • 12. 封装query的常用的四种方法
  • 13. 查询符合条件的第一条数据 findOne()
  • 14. 查询符合条件的所有数据 find()
  • 15. 查询符合条件的数量 count()
  • 16. 同一个字段在条件中的正确写法&>,lt,gte,lte
  • 17. andOperator 且相当于and
  • 18. orOperator 或相当于or
  • 19. andOperator和orOperator联合查询
  • 20. in 在范围元素内
  • 21. nin 不在范围元素内
  • 22. 显示是否有该字段数据的值
  • 23. 分页查询
  • 24. 排序 sort 单个条件排序,多个条件排序
  • 25. 分组查询 group()
  • 27. 模糊匹配,完全匹配,左匹配,右匹配
  • 28. 简单的聚合查询 aggregate()
  • 29. 复杂的聚合查询


1. 插入一条数据 insert()

insert: 若新增数据的主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常提示主键重复,不保存当前数据。
insert: 可以一次性插入一整个列表,而不用进行遍历操作,效率相对较高

/**
     * 插入一条数据,若新增数据的主键已经存在,则会抛异常,不会插入数据
     * <T> T insert(T objectToSave)
     */
    @Test
    public void test01() {
        User user1 = new User("1","关羽","男",30,"蜀国","2020-08-26","190","55");
        User insert = mongoTemplate.insert(user1);
    }

2. 插入一条数据 save()

/**
     * 插入一条数据,若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作
     *  <T> T save(T objectToSave)
     */
    @Test
    public void test02(){
        User user1 = new User("1","关羽","男",33,"蜀国","2020-08-26","190","55");
        User save = mongoTemplate.save(user1);
    }

3. 批量插入 insert()

/**
     * 批量插入insert()
     * <T> Collection<T> insert(Collection<? extends T> batchToSave, Class<?> entityClass
     * batchToSave : 添加对象的集合
     * entityClass: 对象的实体类.class
     */
    @Test
    public void test3(){
        User user2 = new User("2","关凤","女",31,"蜀国","2020-07-26","198","56");
        User user3 = new User("3","关平","男",30,"蜀国","2020-07-26","180","57");
        User user4 = new User("4","张飞","男",19,"蜀国","2020-08-26","177","58");

        User user5 = new User("5","孙权","男",35,"魏国","2020-08-26","177","58");
        User user6 = new User("6","孙玲珑","女",30,"魏国","2020-07-26","189","57");
        List<User> list = new ArrayList<>();
        list.add(user2);
        list.add(user3);
        list.add(user4);
        list.add(user5);
        list.add(user6);
        mongoTemplate.insert(list,User.class);
    }

4. 批量插入 insertAll()

/**
     * 批量插入 insertAll()
     * <T> Collection<T> insertAll(Collection<? extends T> objectsToSave)
     * objectsToSave : 插入的对象集合
     */
    @Test
    public void test4(){
        User user7 = new User("7","孙尚香","女",39,"魏国","2020-07-26","178","45");
        User user8 = new User("8","黄盖","男",30,"魏国","2020-08-26","187","45");

        User user9 = new User("9","曹操","男",34,"吴国国","2020-08-26","199","60");
        User user10 = new User("10","貂蝉","女",30,"吴国国","2020-06-26","190","66");
        User user11 = new User("11","马云禄","女",40,"吴国国","2020-06-26","188","67");
        User user12 = new User("12","曹彰","男",30,"吴国国","2020-08-26","190","68");

        List<User> list = new ArrayList<>();

        list.add(user7);
        list.add(user8);
        list.add(user9);
        list.add(user10);
        list.add(user11);
        list.add(user12);

        mongoTemplate.insertAll(list);
    }

5. 更新查询结果的第一个值 updateFirst()

/**
     * 更新查询结果的第一个值
     * mongoTemplate.update() 不建议用
     * 方法1更新最慢,方法2和方法3差不多
     * 方法1 : UpdateResult updateFirst(Query query, Update update, Class<?> entityClass)
     * 方法2 : UpdateResult updateFirst(Query query, Update update, String collectionName)
     * 方法3 : UpdateResult updateFirst(Query query, Update update, Class<?> entityClass, String collectionName)
     * query : 更新条件
     * update : 更新值
     * entityClass : 集合对应的实体类.class
     * collectionName : 集合名称
     */
    @Test
    public void test6(){

        Query query = new Query();
        query.addCriteria(Criteria.where("address").is("吴国"));

        Update update = new Update();
        update.set("address","吴国国");
        update.set("weight","61");

        long start = System.currentTimeMillis();
        mongoTemplate.updateFirst(query,update,User.class);
        long end = System.currentTimeMillis();
        System.out.println("==========================================");
        System.out.println("方法1耗时: " + (end - start));  //执行最慢

/*        long start1 = System.currentTimeMillis();
        mongoTemplate.updateFirst(query,update,"user");
        long end1 = System.currentTimeMillis();
        System.out.println("==========================================");
        System.out.println("方法2耗时: " + (end1 - start1));  //*/


/*        long start2 = System.currentTimeMillis();
        mongoTemplate.updateFirst(query,update,User.class,"user");
        long end2 = System.currentTimeMillis();
        System.out.println("==========================================");
        System.out.println("方法3耗时: " + (end2 - start2));  //方法2,方法3,差不多*/
    }

6. 更新所有查询结果 updateMulti()

/**
     * 更新所有查询结果
     * 方法1更新最慢,方法2和方法3差不多
     * 方法1 : UpdateResult updateMulti(Query query, Update update, Class<?> entityClass)
     * 方法2 : UpdateResult updateMulti(Query query, Update update, String collectionName)
     * 方法3 : UpdateResult updateMulti(Query query, Update update, Class<?> entityClass, String collectionName)
     * query : 更新条件
     * update : 更新值
     * entityClass : 集合对应的实体类.class
     * collectionName : 集合名称
     */
    @Test
    public void test07(){
        Query query = new Query();
        query.addCriteria(Criteria.where("address").is("吴国"));

        Update update = new Update();
        update.set("address","吴国国");
        update.set("weight","61");

        long start = System.currentTimeMillis();
        mongoTemplate.updateMulti(query,update,User.class);
        long end = System.currentTimeMillis();
        System.out.println("==========================================");
        System.out.println("方法1耗时: " + (end - start));  //40 执行最慢
/
        Query query1 = new Query();
        query1.addCriteria(Criteria.where("address").is("吴国国"));

        Update update1 = new Update();
        update1.set("address","吴国");
        update1.set("weight","61");

        long start1 = System.currentTimeMillis();
        mongoTemplate.updateMulti(query1,update1,"user");
        long end1 = System.currentTimeMillis();
        System.out.println("==========================================");
        System.out.println("方法2耗时: " + (end1 - start1));  //35


        Query query2 = new Query();
        query2.addCriteria(Criteria.where("address").is("吴国"));

        Update update2 = new Update();
        update2.set("address","吴国国");
        update2.set("weight","61");

        long start2 = System.currentTimeMillis();
        mongoTemplate.updateMulti(query2,update2,User.class,"user");
        long end2 = System.currentTimeMillis();
        System.out.println("==========================================");
        System.out.println("方法3耗时: " + (end2 - start2));  //方法2,方法3,差不多
    }

7. 数据库有就修改查询出的第一条,数据库没有就新增一条 upsert()

/**
     * 数据库有就修改查询出的第一条,数据库没有就新增一条
     * 方法1更新最慢,方法2和方法3差不多
     * 方法1 : UpdateResult upsert(Query query, Update update, Class<?> entityClass)
     * 方法2 : UpdateResult upsert(Query query, Update update, String collectionName)
     * 方法3 : UpdateResult upsert(Query query, Update update, Class<?> entityClass, String collectionName)
     * query : 更新条件
     * update : 更新值
     * entityClass : 集合对应的实体类.class
     * collectionName : 集合名称
     */
    @Test
    public void test08(){
        Query query = new Query();
        query.addCriteria(Criteria.where("address").is("魏国国"));

        Update update = new Update();
        update.set("address","魏国");
        update.set("weight","61");

        mongoTemplate.upsert(query,update,User.class);
//        mongoTemplate.upsert(query,update,"user");
//        mongoTemplate.upsert(query,update,User.class,"user");
    }

8. 删除符合条件的记录 remove()

/**
     * 删除符合条件的记录
     * 方法1 : DeleteResult remove(Query query, Update update, Class<?> entityClass)
     * 方法2 : DeleteResult remove(Query query, Update update, String collectionName)
     * 方法3 : DeleteResult remove(Query query, Update update, Class<?> entityClass, String collectionName)
     * query : 删除条件
     * entityClass : 集合对应的实体类.class
     * collectionName : 集合名称
     */
    @Test
    public void test09(){
        Query query = new Query();
        query.addCriteria(Criteria.where("address").is("魏国国"));

        mongoTemplate.remove(query,User.class);
        mongoTemplate.remove(query,"user");
        mongoTemplate.remove(query,User.class,"user");
    }

9. 查询出符合条件的结果,并将符合条件的数据删除,只会删除第一条 findAndRemove()

/**
     * 查询出符合条件的结果,并将符合条件的数据删除,只会删除第一条
     * 方法1 : DeleteResult findAndRemove(Query query, Update update, Class<?> entityClass)
     * 方法2 : DeleteResult findAndRemove(Query query, Update update, Class<?> entityClass, String collectionName)
     * query : 删除条件
     * entityClass : 集合对应的实体类.class
     * collectionName : 集合名称
     */
    @Test
    public void test10(){
        Query query = new Query();
        query.addCriteria(Criteria.where("address").is("魏国国"));

        mongoTemplate.findAndRemove(query,User.class);
        mongoTemplate.findAndRemove(query,User.class,"user");
    }

10. 查询出符合条件的所有结果,并将符合条件的所有数据删除 findAllAndRemove()

/**
     * 查询出符合条件的所有结果,并将符合条件的所有数据删除
     * 方法1 : DeleteResult findAllAndRemove(Query query, Update update, Class<?> entityClass)
     * 方法2 : DeleteResult findAllAndRemove(Query query, Update update, String collectionName)
     * 方法3 : DeleteResult findAllAndRemove(Query query, Update update, Class<?> entityClass, String collectionName)
     * query : 删除条件
     * entityClass : 集合对应的实体类.class
     * collectionName : 集合名称
     */
    @Test
    public void test11(){
        Query query = new Query();
        query.addCriteria(Criteria.where("address").is("魏国国"));

        mongoTemplate.findAllAndRemove(query,User.class);
        mongoTemplate.findAllAndRemove(query,"user");
        mongoTemplate.findAllAndRemove(query,User.class,"user");
    }

11. 查询集合中所有数据,不加条件 findAll()

/**
     *  查询集合中所有数据,不加条件
     *  方法2要快于方法1
     *  方法1 : <T> List<T> findAll(Class<T> entityClass)
     *  方法2 : <T> List<T> findAll(Class<T> entityClass, String collectionName)   (推荐)
     * entityClass : 集合对应的实体类.class
     * collectionName : 集合名称
     */
    @Test
    public void test12(){

        long start1 = System.currentTimeMillis();
        List<User> list1 = mongoTemplate.findAll(User.class);
        long end1 = System.currentTimeMillis();
        System.out.println("方法1查询结果总数 : " + list1.size());
        System.out.println("方法1耗时: " + (end1 - start1));  //
        System.out.println("==========================================");

        long start2 = System.currentTimeMillis();
        List<User> list2 = mongoTemplate.findAll(User.class, "user");
        long end2 = System.currentTimeMillis();
        System.out.println("方法2查询结果总数 : " + list2.size());
        System.out.println("方法2耗时: " + (end2 - start2));  //

    }

12. 封装query的常用的四种方法

/**
     * 封装query的常用的四种方法
     */
    @Test
    public void test13(){

        //方法1
//        Query query = new Query();
//        Criteria criteria = new Criteria();
//        criteria.andOperator(Criteria.where("address").is("中国"),
//                Criteria.where("weight").is("61"));
//        query.addCriteria(criteria);

        //方法2
//        Query query = new Query(new Criteria().andOperator(Criteria.where("address").is("中国"),
//                Criteria.where("weight").is("61")));


        //方法3
//        Query query = new Query();
//        query.addCriteria(Criteria.where("address").is("中国"));
//        query.addCriteria(Criteria.where("weight").is("61"));

        //方法4 (多用于判断多个参数拼接条件)
//        List<Criteria> list=new ArrayList<Criteria>();
//        Criteria criteria = new Criteria();
//        if (1 == 1){  //判断条件
//            criteria = Criteria.where("address").is("中国");
//            list.add(criteria);
//        }
//        if (1 == 1){  //判断条件
//            criteria = Criteria.where("weight").is("61");
//            list.add(criteria);
//        }
//
//        Criteria[] arr = new Criteria[list.size()];
//        list.toArray(arr);
//        Criteria criterias = new Criteria().andOperator(arr);
//        Query query = new Query(criterias);

    }

13. 查询符合条件的第一条数据 findOne()

/**
     *  查询符合条件的第一条数据
     *  方法2要快于方法1
     *  方法1 : <T> T findOne(Query query, Class<T> entityClass)
     *  方法2 : <T> T findOne(Query query, Class<T> entityClass, String collectionName)   (推荐)
     * entityClass : 集合对应的实体类.class
     * collectionName : 集合名称
     */
    @Test
    public void test14(){

        Query query = new Query();
        Criteria criteria = new Criteria();
        criteria.andOperator(Criteria.where("address").is("中国"),
                Criteria.where("weight").is("61"));
        query.addCriteria(criteria);


        long start1 = System.currentTimeMillis();
        User user1 = mongoTemplate.findOne(query, User.class);
        long end1 = System.currentTimeMillis();
        System.out.println("方法1查询结果 : " + user1.getAddress());
        System.out.println("方法1耗时: " + (end1 - start1));  //
        System.out.println("==========================================");

        long start2 = System.currentTimeMillis();
        User user2 = mongoTemplate.findOne(query, User.class, "user");
        long end2 = System.currentTimeMillis();
        System.out.println("方法2查询结果 : " + user2.getAddress());
        System.out.println("方法2耗时: " + (end2 - start2));  //
    }

14. 查询符合条件的所有数据 find()

/**
     *  查询符合条件的所有数据
     *  方法2要快于方法1
     *  方法1 : <T> List<T> find(Query query, Class<T> entityClass)
     *  方法2 : <T> List<T> find(Query query, Class<T> entityClass, String collectionName)   (推荐)
     * entityClass : 集合对应的实体类.class
     * collectionName : 集合名称
     */
    @Test
    public void test15(){

        Query query = new Query();
        Criteria criteria = new Criteria();
        criteria.andOperator(Criteria.where("address").is("魏国"),
                Criteria.where("sex").is("女"));
        query.addCriteria(criteria);


        long start1 = System.currentTimeMillis();
        List<User> list1 = mongoTemplate.find(query, User.class);
        long end1 = System.currentTimeMillis();
        System.out.println("方法1查询结果总数 : " + list1.size());
        System.out.println("方法1耗时: " + (end1 - start1));  //
        System.out.println("==========================================");

        long start2 = System.currentTimeMillis();
        List<User> list2 = mongoTemplate.find(query, User.class, "user");
        long end2 = System.currentTimeMillis();
        System.out.println("方法2查询结果总数 : " + list2.size());
        System.out.println("方法2耗时: " + (end2 - start2));  //
    }

15. 查询符合条件的数量 count()

/**
     * 查询符合条件的数量
     * 方法2,3 快于 方法1
     * 方法1 : long count(Query query, Class<?> entityClass)
     * 方法2 : long count(Query query, String collectionName)
     * 方法3 : long count(Query query, @Nullable Class<?> entityClass, String collectionName)
     */
    @Test
    public void test16(){
        Query query = new Query();
        Criteria criteria = new Criteria();
        criteria.andOperator(Criteria.where("address").is("魏国"),
                Criteria.where("sex").is("女"));
        query.addCriteria(criteria);

        long start1 = System.currentTimeMillis();
        long count1 = mongoTemplate.count(query, User.class);
        long end1 = System.currentTimeMillis();
        System.out.println("方法1查询结果总数 : " + count1);
        System.out.println("方法1耗时: " + (end1 - start1));
        System.out.println("==========================================");

        long start2 = System.currentTimeMillis();
        long count2 = mongoTemplate.count(query, "user");
        long end2 = System.currentTimeMillis();
        System.out.println("方法2查询结果总数 : " + count2);
        System.out.println("方法2耗时: " + (end2 - start2));
        System.out.println("==========================================");

        long start3 = System.currentTimeMillis();
        long count3 = mongoTemplate.count(query, User.class,"user");
        long end3 = System.currentTimeMillis();
        System.out.println("方法3查询结果总数 : " + count3);
        System.out.println("方法3耗时: " + (end3 - start3));
        System.out.println("==========================================");
    }

16. 同一个字段在条件中的正确写法&>,lt,gte,lte

/**
     * 同一个字段在条件中的正确写法&>,lt,gte,lte,
     */
    @Test
    public void test17() {
        //这种写法是错误的 (同一个字段(insertDt)在一个查询中不能用这种方式)
//        Query query = new Query();
//        query.addCriteria(Criteria.where("insertDt").gte("2020-07-01"));
//        query.addCriteria(Criteria.where("insertDt").lte("2020-07-31"));

        //这种写法是错误的(同一个查询不能同时出现多次andOperator或者orOperator)
//        Criteria criteria = new Criteria().andOperator(Criteria.where("insertDt").gte("2020-07-01")).andOperator(Criteria.where("insertDt").lte("2020-07-31"));
//        Query query = new Query(criteria);

        //正确的写法
        Criteria criteria = new Criteria().andOperator(Criteria.where("insertDt").gte("2020-07-01"),
                Criteria.where("insertDt").lte("2020-07-31"));
        Query query = new Query(criteria);



        List<User> list = mongoTemplate.find(query, User.class, "user");
        for (User user : list) {
            System.out.println(user.getName());
        }
    }

17. andOperator 且相当于and

/**
     * andOperator  且相当于and
     */
    @Test
    public void test18() {
        Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("魏国"),
                Criteria.where("sex").is("女"));
        Query query = new Query(criteria);

        List<User> list = mongoTemplate.find(query, User.class, "user");
        for (User user : list) {
            System.out.println(user.getName());
        }
    }

18. orOperator 或相当于or

/**
     * orOperator 或相当于or
     */
    @Test
    public void test19() {
        Criteria criteria = new Criteria().orOperator(Criteria.where("address").is("魏国"),
                Criteria.where("height").is("177"));
//        Criteria criteria = new Criteria().orOperator(Criteria.where("address").is("魏国"),
//                Criteria.where("address").is("吴国国"));
        Query query = new Query(criteria);

        List<User> list = mongoTemplate.find(query, User.class, "user");
        for (User user : list) {
            System.out.println(user.getName());
        }
    }

19. andOperator和orOperator联合查询

/**
     * andOperator和orOperator联合查询
     */
    @Test
    public void test20() {

        //andOperator,orOperator-->orOperator
        Criteria criteria1 = new Criteria().andOperator(Criteria.where("sex").is("女"),
                Criteria.where("age").lt(35));

        Criteria criteria2 = new Criteria().orOperator(Criteria.where("address").is("魏国"), Criteria.where("weight").is("61"));
        Criteria criteria = new Criteria();

        criteria.orOperator(criteria1, criteria2);
        Query query = new Query(criteria);

        //andOperator,andOperator-->orOperator
/*        Criteria criteria1 = new Criteria().andOperator(Criteria.where("sex").is("女"),
                Criteria.where("age").lt(35));

        Criteria criteria2 = new Criteria().andOperator(Criteria.where("address").is("魏国"));
        Criteria criteria = new Criteria();

        criteria.orOperator(criteria1,criteria2);
        Query query = new Query(criteria);*/

        List<User> list = mongoTemplate.find(query, User.class, "user");
        for (User user : list) {
            System.out.println(user.getName());
        }
    }

20. in 在范围元素内

/**
     * in 在范围元素内
     */
    @Test
    public void test21() {
        List<String> names = new ArrayList<>();
        Collections.addAll(names, "关羽", "关凤", "关平");

        Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("蜀国"),
                Criteria.where("name").in(names));
        Query query = new Query(criteria);

        List<User> list = mongoTemplate.find(query, User.class, "user");
        for (User user : list) {
            System.out.println(user.getName());
        }
    }

21. nin 不在范围元素内

/**
     * nin 不在范围元素内
     */
    @Test
    public void test22() {
        List<String> names = new ArrayList<>();
        Collections.addAll(names, "关羽", "关凤", "关平");

        Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("蜀国"),
                Criteria.where("name").nin(names));
        Query query = new Query(criteria);

        List<User> list = mongoTemplate.find(query, User.class, "user");
        for (User user : list) {
            System.out.println(user.getName());
        }
    }

22. 显示是否有该字段数据的值

/**
     * 显示是否有该字段数据的值
     * exists(boolean b) true:是  false:否
     */
    @Test
    public void test23() {
        Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("中国"),
                Criteria.where("age").exists(false));
        Query query = new Query(criteria);

//        Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("蜀国"),
//                Criteria.where("age").exists(true));
//        Query query = new Query(criteria);

        List<User> list = mongoTemplate.find(query, User.class, "user");
        for (User user : list) {
            System.out.println(user.getName() + "====" + user.getAddress());
        }
    }

23. 分页查询

/**
     * 分页查询
     */
    @Test
    public void test24() {
        int currentPage = 1;  //当前页
        int pageSize = 5;    //每页显示记录数
        Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("蜀国"));
        Query query = new Query(criteria);
        query.skip((currentPage - 1) * pageSize);
        query.limit(pageSize);
        //简化代码
//        query.skip((currentPage - 1) * pageSize).limit(pageSize);

        //另一种方式
//        Pageable pageable = new PageRequest((currentPage - 1) * pageSize, pageSize);
//        query.with(pageable);


        List<User> list = mongoTemplate.find(query, User.class, "user");

        //查询总记录数
        int total = (int) mongoTemplate.count(query, User.class, "user");
        int totalCount = Integer.parseInt(String.valueOf(total));
        //总页数
        int totalPage = 0;
        if (totalCount <= pageSize) {
            totalPage = 1;
        } else {
            totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
        }

        System.out.println("总记录数: " + totalCount);
        System.out.println("总页数: " + totalPage);
        for (User user : list) {
            System.out.println(user.getId() + "=============" + user.getName());
        }
    }

24. 排序 sort 单个条件排序,多个条件排序

/**
     * 排序 sort  单个条件排序,多个条件排序
     */
    @Test
    public void test25() {
        int currentPage = 1;  //当前页
        int pageSize = 5;    //每页显示记录数
        Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("魏国"));
        Query query = new Query(criteria);

        //方式1 单个条件的排序
        Sort sort = new Sort(Sort.Direction.DESC, "insertDt");

        //方式2 单个条件的排序
//        Sort sort = Sort.by(Sort.Order.desc("insertDt"));

        //多个条件排序
//        Sort sort = Sort.by(Sort.Order.desc("insertDt"),
//                Sort.Order.asc("age"));

        query.with(sort);

        query.skip((currentPage - 1) * pageSize).limit(pageSize);
        List<User> list = mongoTemplate.find(query, User.class, "user");

        //查询总记录数
        long total = mongoTemplate.count(query, User.class, "user");
        int totalCount = Integer.parseInt(String.valueOf(total));
        //总页数
        int totalPage = 0;
        if (totalCount <= pageSize) {
            totalPage = 1;
        } else {
            totalPage = (totalCount % pageSize) == 0 ? (totalCount / pageSize) : (totalCount / pageSize + 1);
        }

        System.out.println("总记录数: " + totalCount);
        System.out.println("总页数: " + totalPage);
        for (User user : list) {
            System.out.println(user.getId() + "===" + user.getName() + "===" + user.getInsertDt() + "===" + user.getAge());
        }
    }

25. 分组查询 group()

/**
     *  分组查询
     * <T> GroupByResults<T> group(@Nullable Criteria criteria, String inputCollectionName, GroupBy groupBy, Class<T> entityClass)
     * criteria : 查询条件
     * inputCollectionName : 集合名称
     * groupBy : 分组条件
     * entityClass : 集合对应的实体类.class
     */
    @Test
    public void test26() {

//        Criteria criteria = new Criteria().andOperator(Criteria.where("address").is("魏国"));
        Criteria criteria = new Criteria();

        String reduce = "function reduce(doc,out){" +
                            "var height = parseFloat(doc.height);" +
                            "var weight = parseFloat(doc.weight);" +
                            "out.sumHeight += height;" +
                            "out.sumWeight += weight; " +
                             "out.address = doc.address" +
                        "}";
        GroupBy groupBy = new GroupBy("address")
                .initialDocument("{address:'',sumHeight:0,sumWeight:0}")
                .reduceFunction(reduce);
        GroupByResults<User> result = mongoTemplate.group(criteria, "user", groupBy, User.class);

        List list = (List) result.getRawResults().get("retval");

        list.forEach(item->{
            Document doc = (Document) item;
            String address = doc.getString("address");
            Double height = doc.getDouble("sumHeight");
            Double weight = doc.getDouble("sumWeight");
            System.out.println(address + "==" + height + "==" + weight);
        });
    }

27. 模糊匹配,完全匹配,左匹配,右匹配

/**
     * 模糊匹配,完全匹配,左匹配,右匹配
     */
    @Test
    public void test29(){
        String str = "孙珑";
        //完全匹配
//        Pattern pattern = Pattern.compile("^" + str + "$", Pattern.CASE_INSENSITIVE);
        //右匹配
//        Pattern pattern = Pattern.compile("^.*" + str + "$", Pattern.CASE_INSENSITIVE);
        //左匹配
//        Pattern pattern = Pattern.compile("^" + str + ".*$", Pattern.CASE_INSENSITIVE);
        //模糊匹配
        Pattern pattern = Pattern.compile("^.*" + str + ".*$", Pattern.CASE_INSENSITIVE);
        Criteria criteria = new Criteria().andOperator(/*Criteria.where("address").is("魏国"),*/
                Criteria.where("name").regex(pattern));
        Query query = new Query(criteria);
        List<User> list = mongoTemplate.find(query, User.class, "user");
        for (User user : list) {
            System.out.println(user.getName() + "==" + user.getAddress());
        }
    }

28. 简单的聚合查询 aggregate()

/**
     * 简单的聚合查询
     * <O> AggregationResults<O> aggregate(Aggregation aggregation, String collectionName, Class<O> outputType)
     * aggregation : 条件
     * collectionName : 集合名字
     * outputType : 查询的结果类型(xxx.class)
     */
    @Test
    public void test27(){
        Criteria criteria1 = new Criteria().andOperator(Criteria.where("insertDt").gte("2020-07-01"),
                Criteria.where("insertDt").lte("2020-07-31"));
        Criteria criteria2 = Criteria.where("sex").is("女");
        Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria1),
                Aggregation.match(criteria2));

        AggregationResults<User> result = mongoTemplate.aggregate(aggregation, "user", User.class);
        List<User> list = result.getMappedResults();
        list.forEach(item->{
            System.out.println(item.getName());
        });

    }

29. 复杂的聚合查询

/**
     * 复杂的聚合查询
     * <O> AggregationResults<O> aggregate(Aggregation aggregation, String collectionName, Class<O> outputType)
     * aggregation : 条件
     * collectionName : 集合名字
     * outputType : 查询的结果类型(xxx.class)
     */
    @Test
    public void test28(){
        int pageNum = 1;
        int pageSize = 3;
        Criteria criteria1 = new Criteria().andOperator(Criteria.where("insertDt").gte("2020-07-01"),
                Criteria.where("insertDt").lte("2020-07-31"));
        /**
         * project : 列出所有本次查询的字段,包括查询条件的字段和需要搜索的字段
         * match : 搜索条件criteria
         * group : 分组的字段,以及聚合相关查询
         * sum : 求和
         * count : 数量
         * max ; 最大值
         * min : 最小值
         * avg : 平均值
         * sort ; 排序
         * skip&limit:分页查询
         */
        Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria1),
//                Aggregation.project("address","insertDt","age","name"),
                Aggregation.sort(new Sort(Sort.Direction.DESC, "insertDt")),
                Aggregation.skip(pageNum),
                Aggregation.limit(pageSize),
                Aggregation.group("address").sum("age").as("sum").count().as("count").max("age").as("max")
        .min("age").as("min").avg("age").as("avg").first("name").as("name"));

        AggregationResults<ResultModel> user = mongoTemplate.aggregate(aggregation, "user", ResultModel.class);
        List<ResultModel> results = user.getMappedResults();


        for (ResultModel result : results) {
            System.out.println(result.getName() + "==" + result.getAddress() + "==" + result.getSum() + "==" +result.getCount()+"=="+
                    result.getMax()+"==" + result.getMin());
        }

    }