暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【MongoDB】SpringBoot - 分页与去重查询

左羊公社 2022-07-11
2658


一、 去重
mongo Shell
    伪代码
    db.集合.distinct("字段名")
    示例代码
    //去重(查询性别种类)
    db.hero.distinct('gender')
    // 测试 结果
    [
    "女",
    "男"
    ]
    //根据条件去重(查询年龄在12至19岁之间的年龄列表)
    db.hero.distinct('age',{'age':{$gt:12,$lt:19}})
    // 测试 结果
    [
    13,
    14,
    15,
    16,
    17,
    18
    ]
    复制
     
    mongoTemplate
      //去重(查询性别种类)
      @Test
      void findDistinctTest(){
      Query query =new Query();
      List<String> genders = mongoTemplate.findDistinct(query,"gender","hero",String.class);
      genders.stream().forEach(System.out::println);
      }
      复制
        //根据条件去重(查询年龄在12至19岁之间的年龄列表)
        @Test
        void findDistinctByAgeTest(){
        Query query =new Query();
        query.addCriteria(new Criteria("age").gt(12).lt(19));
        List<Integer> genders = mongoTemplate.findDistinct(query,"age","hero",Integer.class);
        genders.stream().forEach(System.out::println);
        }


        复制
         
        二、 分页
        mongo Shell
        limit 分页
          伪代码
          db.集合.find().limit(行数)
          示例代码
          // 分页
          db.hero.find().limit(2)
          // 测试结果
          // 1
          {
          "_id": ObjectId("6292e32a63fd032330a30ba4"),
          "name": "陈",
          "gender": "男",
          "age": NumberInt("55"),
          "dt": NumberLong("1653793578431116400")
          }


          // 2
          {
          "_id": ObjectId("6292e8c0fa63510b5822a5f4"),
          "name": "席盆哲",
          "gender": "男",
          "age": NumberInt("54"),
          "dt": NumberLong("1653795008039"),
          "_class": "com.zuoyang.springbootmongo.domain.Hero"
          }
          // 根据条件分页(查询年龄在12至19岁之间,性别为男的两条数据)
          db.hero.find({'age':{$gt:12,$lt:19},'gender':'男'}).limit(2)
          // 测试结果
          // 1
          {
          "_id": ObjectId("6292e8c1fa63510b5822a654"),
          "name": "但装赣",
          "gender": "男",
          "age": NumberInt("13"),
          "dt": NumberLong("1653795009258"),
          "_class": "com.zuoyang.springbootmongo.domain.Hero"
          }


          // 2
          {
          "_id": ObjectId("6292e8c1fa63510b5822a7da"),
          "name": "富入",
          "gender": "男",
          "age": NumberInt("13"),
          "dt": NumberLong("1653795009741"),
          "_class": "com.zuoyang.springbootmongo.domain.Hero"
          }
          复制
          count 统计行数
            伪代码
            db.集合.find().count()
            示例代码
            // 统计
            db.hero.find().count()
            // 测试结果
            // 1
            1001001
            // 根据条件统计(统计年龄在12至19岁之间,性别为男的数量)
            db.hero.find({'age':{$gt:12,$lt:19},'gender':'男'}).count()
            // 测试结果
            // 1
            35404
            复制
             
            mongoTemplate
            分页&统计行数(空参)
               @Test
              void findTest(){
              Query query =new Query();
              // Criteria criteria = new Criteria("age").is(15);
              // query.addCriteria(criteria);
              int pageSize = 2; //行数
              int pageConut = 1; //页数
              // 统计总行数
              long count = mongoTemplate.count(query,Hero.class);
              System.out.println("总行数: "+count);
              Pageable pageable = PageRequest.of(pageConut,pageSize);
              query.with(pageable);


              List<Hero> heroes = mongoTemplate.find(query,Hero.class);
              for (Hero hero : heroes) {
              System.out.println(hero.getName());
              }
              }


              复制
              分页&统计行数(条件查询)
                @Test
                void findByAgeTest(){
                Query query =new Query();
                Criteria criteria = new Criteria("age").is(15);
                query.addCriteria(criteria);
                int pageSize = 2; //行数
                int pageConut = 1; //页数
                // 统计总行数
                long count = mongoTemplate.count(query,Hero.class);
                System.out.println("总行数: "+count);
                Pageable pageable = PageRequest.of(pageConut,pageSize);
                query.with(pageable);


                List<Hero> heroes = mongoTemplate.find(query,Hero.class);
                for (Hero hero : heroes) {
                System.out.println("姓名: "+hero.getName()+" 年龄: "+hero.getAge());
                }
                }


                复制
                 
                三、 场景结合(工程化)
                1. 为一个【下拉框】提供实时数据接口
                单字段 去重查询
                  /**
                  * 获取性别列表(前端下拉列表数据类型)
                  * @return
                  */
                  @Override
                  public List<Map> findGenderList(){
                  List<Map> datas = new ArrayList();
                  Query query =new Query();
                  for (String s : mongoTemplate.findDistinct(query, "gender", "hero", String.class)) {
                  Map map = new HashMap();
                  map.put("lable",s);
                  map.put("value",s);
                  datas.add(map);
                  }
                  return datas;
                  }


                  复制

                  测试用例
                    /**
                    * 获取性别列表(前端下拉列表数据类型)测试用例
                    */
                    @Test
                    void findGenderList(){
                    System.out.println(heroService.findGenderList());
                    }
                    复制
                    2. 实现一个分页列表查询 接口
                    • 统计命中条数
                    • 按页号与行数返回数据
                      /**
                      * 分页查询
                      * @param pageConut 页数
                      * @param pageSize 行数
                      * @return
                      */
                      @Override
                      public Map pageHeros(int pageConut,int pageSize){
                      Map data = new HashMap();
                      Query query =new Query();
                      // 统计总行数
                      long count = mongoTemplate.count(query, Hero.class);
                      Pageable pageable = PageRequest.of(pageConut,pageSize);
                      query.with(pageable);
                      List<Hero> heroes = mongoTemplate.find(query,Hero.class);
                      data.put("pageConut",pageConut);
                      data.put("pageSize",pageSize);
                      data.put("count",count);
                      data.put("data",heroes);
                      return data;
                      }


                      复制
                      测试用例
                        /**
                        * 分页查询 测试用例
                        * @return
                        */
                        @Test
                        void pageHerosTest(){
                        Map map= heroService.pageHeros(1,3);
                        System.out.println("pageConut: " + map.get("pageConut"));
                        System.out.println("data: " + map.get("data"));
                        System.out.println("count: " + map.get("count"));
                        System.out.println("pageSize: " + map.get("pageSize"));
                        }


                        复制
                         
                        3. 实现一个多条件分页列表查询 接口
                        • 统计命中条数
                        • 按页号与行数返回数据
                        • 根据入参条件筛选数据
                          /**
                          * 分页条件查询
                          * @param pageConut 页数
                          * @param pageSize 行数
                          * @param gender 性别
                          * @return
                          */
                          @Override
                          public Map pageHerosByGender(int pageConut, int pageSize, String gender){
                          Map data = new HashMap();
                          Query query =new Query();
                          query.addCriteria(new Criteria("gender").is(gender));
                          // 统计总行数
                          long count = mongoTemplate.count(query, Hero.class);
                          Pageable pageable = PageRequest.of(pageConut,pageSize);
                          query.with(pageable);
                          List<Hero> heroes = mongoTemplate.find(query,Hero.class);
                          data.put("pageConut",pageConut);
                          data.put("pageSize",pageSize);
                          data.put("count",count);
                          data.put("data",heroes);
                          return data;
                          }


                          复制
                          测试用例
                            /**
                            * 分页条件查询 测试用例
                            * @return
                            */
                            @Test
                            void pageHerosByGender(){
                            Map map= heroService.pageHerosByGender(1,3,"男");
                            System.out.println("pageConut: " + map.get("pageConut"));
                            System.out.println("data: " + map.get("data"));
                            System.out.println("count: " + map.get("count"));
                            System.out.println("pageSize: " + map.get("pageSize"));
                            }


                            复制
                            感谢你的观看,Yes!





                            文章转载自左羊公社,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论