所有数据存储在mongodb中,在mongodb中进行分页,需要自己处理分页条件,使用skip和limit进行查询当前页面的数据。
注意:
mongo是通过正则表达式的形式增加模糊过滤
mongodb对数据类型敏感
package com.jesse.service.impl.metadata;
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.*;
import java.util.regex.Pattern;
/**
* 业务实现
* @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;
/**
* 带分页的查询
* @param page
* @param checkTable
* @return
*/
@Override
public Page<MetadataCheckTable> selectMetadataCheckTable(Page<MetadataCheckTable> page, MetadataCheckTable checkTable) {
long currentPage = page.getCurrentPage();
long pageSize = page.getPageSize();
long skip = (currentPage-1)*pageSize;
Criteria criteria = Criteria.where(MongoDbCollectionEnum.TASK_ID.getValue()).is(checkTable.getTaskId()+"")
.and(MongoDbCollectionEnum.CHECK_CONFIG_ID.getValue()).is(checkTable.getCheckConfigId()+"");
//如果表名不为空,增加表名模糊过滤,mongo是通过正则表达式的形式
if (StringUtils.isNotBlank(checkTable.getTableName())){
Pattern pattern = Pattern.compile(".*"+checkTable.getTableName()+".*", Pattern.CASE_INSENSITIVE);
criteria.and("tableName").regex(pattern);
}
//增加条件,属性值>0
if (StringUtils.isNotBlank(checkTable.getCheckAttrName())){
criteria.and("metrics.tableCheck.attrCheck."+checkTable.getCheckAttrName()).gt(0);
}
Query query = new Query(criteria);
//获取总数量
long total = mongoTemplate.count(query, MetadataCheckTable.class, MetaDataCheckHistoryConstants.METADATA_CHECK_METRIC);
//获取总页数
long pages = (long)Math.ceil(total/pageSize) ;
//mongo分页通过skip和limit
query.skip(skip).limit((int)pageSize);
//查询当前页的数据。
List<MetadataCheckTable> list = mongoTemplate.find(query, MetadataCheckTable.class,MetaDataCheckHistoryConstants.METADATA_CHECK_METRIC);
//处理结果集,将相应数据封装到实体
list.forEach(metadataCheckTable -> {
LinkedHashMap<String, String> attrCheck = metadataCheckTable.getTableResult().get("attrCheck");
if (attrCheck!=null &&!attrCheck.isEmpty()){
//attrCheck是map,可以直接获取values。
String values = attrCheck.values().toString();
//去掉两边的[]
String attrName = StringUtils.strip(values,"[]");
metadataCheckTable.setAttrCheck(attrName);
}
});
//将结果封装到page中。
Page<MetadataCheckTable> pageList = new Page<>();
pageList.setTotal(total);
pageList.setPages(pages);
pageList.setCurrentPage(currentPage);
pageList.setPageSize(pageSize);
pageList.setRecords(list);
return pageList;
}
}