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(通用属性匹配器)的查询方式