MongDB复杂查询

MongoRepository适合简单查询,方便快捷,当查询条件较多的时候,使用

mongoTemplate

   /**
     *
     * @param page 起始页
     * @param limit 每页记录数
     * @param hoscode 医院编号
     * @param depcode 科室编号
     * @return
     */
    @Override
    public Map<String, Object> getScheduleRule(Long page, Long limit, String hoscode, String depcode) {
//       根据hoscode、depcode按排班日期统计号源信息(聚合查询)带分页,使用工具根据日期推算周几
        //查询条件:根据医院编号和科室编号查询
        Criteria criteria = Criteria.where("hoscode").is(hoscode).and("depcode").is(depcode);
        //根据工作日workDate期进行分组(创建查询条件)
        Aggregation agg = Aggregation.newAggregation(
                //1 查询条件
                Aggregation.match(criteria),
                Aggregation
                        //2 按照日期分组
                        .group("workDate").first("workDate").as("workDate")
                        //3 可预约数
                        .sum("reservedNumber").as("reservedNumber")
                        //4 剩余预约数
                        .sum("availableNumber").as("availableNumber"),
                //5 排序
                Aggregation.sort(Sort.Direction.ASC, "workDate"),
                //6 分页(跳过几条数据,比如一页显示2两条记录,那么第二页就从第三条数据开始展示,需要跳过前两条记录)
                Aggregation.skip((page - 1) * limit),
//                每页记录数
                Aggregation.limit(limit)
        );
//      执行查询,查询Schedule集合,将文档中的同名字段数据存入BookingScheduleRuleVo类
//      执行聚合查询,获取结果
        AggregationResults<ScheduleRuleVo> aggResults = mongoTemplate.aggregate(agg, Schedule.class, ScheduleRuleVo.class);
        //获取查询结果
        List<ScheduleRuleVo> list = aggResults.getMappedResults();


        //分组查询后的总记录数
        //根据条件进行聚合查询 total
        Aggregation totalAgg = Aggregation.newAggregation(
                //设置筛选条件
                Aggregation.match(criteria),
                //指定分组字段,统计字段
                Aggregation.group("workDate")
        );
        AggregationResults<ScheduleRuleVo> totalAggResults = mongoTemplate.aggregate(totalAgg, Schedule.class, ScheduleRuleVo.class);
        int total = totalAggResults.getMappedResults().size();
        //根据日期计算对应星期获取 (iter)
        //遍历集合,换算周几封装数据
        for (ScheduleRuleVo scheduleRuleVo : list) {
            Date workDate = scheduleRuleVo.getWorkDate();
            String dayOfWeek = DateUtil.getDayOfWeek(new DateTime(workDate));
            scheduleRuleVo.setDayOfWeek(dayOfWeek);
        }
        //把数据存入map,返回数据
        Map<String, Object> result = new HashMap<>();
        result.put("list", list);
        result.put("total", total);
        return result;

    }
Criteria:MongoDB的Criteria对象是Spring Data MongoDB提供的一种查询条件构建工具,用于在MongoDB中执行查询操作。您可以使用Criteria对象来指定查询的条件,例如等于、不等于、大于、小于等操作。

 以下是一个示例,展示如何使用Criteria对象构建查询条件:

import org.springframework.data.mongodb.core.query.Criteria;

// 创建Criteria对象
Criteria criteria = Criteria.where("age").gt(18).and("name").is("John");

// 执行查询操作
List<User> users = mongoTemplate.find(Query.query(criteria), User.class);

在上面的示例中,我们创建了一个Criteria对象,其中where方法用于指定查询字段,gt表示大于操作符,and表示与操作符,is表示等于操作符。最后,我们使用mongoTemplate.find方法执行查询,并传递了一个Query对象,该对象使用了我们构建的Criteria对象。

Aggregation:
match:代表的是where条件,
gte:>
lte:<
is:==
group:分组
count:数量
first:过滤显示的属性
sort:排序
skip和limit:组合使用为分页
page:当前页
size:每页中显示的条数

 这几个属性的顺序不要打乱,打乱会报错的。

MongoRepository分页查询示例

    public Page<Department> PageList(int page, int limit, String hoscode) {
//        排序方式
        Sort sort = Sort.by(Sort.Direction.ASC, "hoscode");
//        创建分页对象
        Pageable pageable = PageRequest.of(page - 1, limit, sort);
//        创建查询对象
        Department department = new Department();
//        封装查询条件
        department.setHoscode(hoscode);
//        创建查询条件模板
        Example<Department> example = Example.of(department);
//        查询
        Page<Department> all = departmentRepository.findAll(example, pageable);
        return all;
    }

MongoRepository带条件查询

    public List<Hospital> selectList(String hosname, String hostype, String districtCode) {
//      创建排序对象,根据hoscode排序
        Sort sort = Sort.by(Sort.Direction.ASC, "hoscode");
//        创建条件匹配器
        ExampleMatcher matcher = ExampleMatcher.matching() //  contains表示模糊匹配    exact精确匹配
                .withMatcher("hosname", ExampleMatcher.GenericPropertyMatchers.contains())
                .withMatcher("hostype", ExampleMatcher.GenericPropertyMatchers.exact())
                .withMatcher("districtCode", ExampleMatcher.GenericPropertyMatchers.exact());

//        创建查询对象,将查询条件设置进去
        Hospital hospital = new Hospital();
        hospital.setHosname(hosname);
        hospital.setHostype(hostype);
        hospital.setDistrictCode(districtCode);
//        0 表示下线 1 表示上线,首页只需要展示已经上线的数据
        hospital.setStatus(1);
        Example<Hospital> example = Example.of(hospital, matcher);
//        执行查询
        List<Hospital> list = hospitalRepository.findAll(example, sort);
        return list;
    }

Sort : 指定排序条件

ExampleMather : 匹配器示例,用于构建匹配条件

Example.of() : 用于创建查询条件的示例对象,以便在查询中使用该对象来匹配符合条件的文档。它通常与查询方法(如findAll(Example<T> example))一起使用,以根据指定的示例对象执行查询操作

注意:常见的ExampleMatcher.GenericPropertyMatchers(通用属性匹配器)的查询方式

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值