带分页的数据查询,主数据还是从关系型数据库MySQL中查询出来的,然后从结果集中获取相关条件,然后根据条件去mongodb中进行数据统计。
注意:
mongodb对数据类型敏感,类型一定要填对,不然查询不到数据。
话不多说,直接上代码。
package com.xjx.services;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/**
* 业务实现
* @author jesse
* @date 2021-01-12 10:23:32
*/
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class MetadataCheckHistoryServiceImpl extends BaseServiceImpl<MetadataCheckHistory,Integer, MetadataCheckHistoryMapper> implements MetadataCheckHistoryService {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public Page<MetadataCheckHistory> selectMetadataCheckHistory(Page<MetadataCheckHistory> page, MetadataCheckHistory checkHistory) {
//从mysql数据库中查询出相关数据
Page<MetadataCheckHistory> resultPage = baseMapper.selectMetadataCheckHistory(page,checkHistory);
//遍历结果集
resultPage.getRecords().forEach(entity -> {
Long checkConfigId = entity.getCheckConfigId();
//根据条件去mongodb数据库中查询相关数据
HashMap map = getStatisticNum(checkConfigId, entity.getTaskId());
//将结果封装到实体中。
if (map!=null&&!map.isEmpty()) {
entity.setTableNum(Long.parseLong(String.valueOf(map.get("tableNum"))));
entity.setColumnNum(Long.parseLong(String.valueOf(map.get("columnNum"))));
}
});
return resultPage;
}
/**
* 从mongodb中获取统计信息
* @param checkConfigId 配置id
* @param taskId 任务id
* @return hashMap
*/
private HashMap getStatisticNum(Long checkConfigId,Long taskId){
//封装查询条件
List<AggregationOperation> operations = new ArrayList<>();
//增加条件,注意:mongodb对数据类型敏感,如果是字符串,传数字是查不出来的。
operations.add(Aggregation.match(Criteria.where("taskId").is(taskId+"").and("checkConfigId").is(checkConfigId+"")));
//设置聚合,可以同时sum和count,但是需要group。
operations.add(Aggregation.group("taskId")
.sum("metrics.tableCheck.attrCheck.noNameCheck").as("tableNoNameCheck")
.sum("metrics.tableCheck.attrCheck.subjectCheck").as("subjectCheck")
.sum("columnNum").as("columnNum")
.count().as("tableNum")
);
Aggregation aggregation = Aggregation.newAggregation(operations);
//使用mongoTemplate进行操作,第一个参数是封装的条件,第二个参数是需要操作的集合,第三个参数是返回的类型
AggregationResults<HashMap> ar = mongoTemplate.aggregate(aggregation, ConstantsEnum.METADATA_CHECK_METRIC, HashMap.class);
return ar.getUniqueMappedResult();
}
}