使用mongoTemplate进行数据统计,部分数据在mongodb

带分页的数据查询,主数据还是从关系型数据库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();
    }
}

上一篇:Excel 2010 SQL应用103 域聚合函数之DLOOKUP


下一篇:springboot整合mongodb MongoTemplate和MongoRepository的用法