Mongodb 多条件 聚合操作


 Aggregation managerSum = Aggregation.newAggregation(
                Aggregation.unwind("asset_manager_lease"),
                Aggregation.match(criteria),
                Aggregation.group("asset_manager_lease.asset_operator")
              .first("asset_manager_lease.asset_operator").as("assetOperator")               .count().as("assetTotal"), Aggregation.sort(Sort.Direction.DESC,"_id") );
//操作数据库获取集合
AggregationResults<OperatorDTO> aggregate = mongoTemplate.aggregate(managerSum, manager, OperatorDTO.class);
List<OperatorDTO> operatorDTOS = aggregate.getMappedResults();
 
 public List<AssetManagerDTO> findByAll(AssetManagerFrom assetManagerFrom, Pageable pageable,String dept) {
        //待查询字段 租赁状态 面积 资产价值 资产数量
        List<AggregationOperation> aggregationOperations = getAllQuery(assetManagerFrom,dept);
        aggregationOperations.addAll(CommentUtils.addPageCriteria(pageable));
        
        Aggregation managerSum = Aggregation.newAggregation(aggregationOperations);
        
        AggregationResults<AssetManagerDTO> aggregate = mongoTemplate.aggregate(managerSum, manager, AssetManagerDTO.class);
        List<AssetManagerDTO> assetManagerEntityList = aggregate.getMappedResults();
        return assetManagerEntityList;
}
//getAllQuery()方法
private List<AggregationOperation> getAllQuery(AssetManagerFrom assetManagerFrom, String dept) {
Criteria criteria = Criteria.where("deleted").is(false);
//根据资产运营人查询
Criteria criteriaC = new Criteria();
List<AggregationOperation> operations = new ArrayList<>();
operations.add(Aggregation.unwind("asset_manager_lease"));

Criteria criteria1 = CoverUtil.analysis(dept, assetManagerFrom.getAssetOperator());
operations.add(Aggregation.match(criteria1));
//模糊匹配 //关联从表名 //主表关联字段 //从表关联的字段 //查询结果名
LookupOperation lookupOperation = LookupOperation.newLookup().
from(managerSenior).
localField("senior_id").
foreignField("_id").
as("inventory_docs");
operations.add(lookupOperation);
operations.add(Aggregation.unwind("inventory_docs"));
Criteria criteriaA = new Criteria();
Criteria criteriaB = new Criteria();
Criteria criteriaD = new Criteria();
if (CommentUtils.isNotEmpty(assetManagerFrom)) {
//按上次盘点时间查询
if (CommentUtils.isNotEmpty(assetManagerFrom.getLatestDate())) {
String inventoryDate = DateUtils.getDateByMonth(assetManagerFrom.getLatestDate());
criteriaA.orOperator(Criteria.where("inventory_date").lte(inventoryDate),
Criteria.where("inventory_date").is(null));
}
//按照租赁状态查询
if (CommentUtils.isNotEmpty(assetManagerFrom.getLeaseDeadline())) {
//查询即将到期
if (DictionaryEnum.EXPIRE.getCode().equals(assetManagerFrom.getLeaseDeadline())) {
String endDate = DateUtils.getDateByMonth(-1);
criteria.and("asset_manager_lease.reality_lease_end_time").lte(endDate).and("asset_manager_lease.lease_state")
.is(DictionaryEnum.OCCUPY.getCode());
} else {
criteria.and("asset_manager_lease.lease_state").is(assetManagerFrom.getLeaseDeadline());
}
criteria.and("asset_state").is(DictionaryEnum.ASSET_AGREE.getCode());
}
if (CommentUtils.isNotEmpty(assetManagerFrom.getAssetState())) {
criteriaD.and("asset_state").is(assetManagerFrom.getAssetState());
}

//根据资产名称、产权所有人、资产运营人、租赁位置、房产证编号模糊匹配
if (CommentUtils.isNotEmpty(assetManagerFrom.getFuzzyQuery())) {
String fuzzyQuery = assetManagerFrom.getFuzzyQuery();
String regex = "^.*" + fuzzyQuery + ".*$";

Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
criteriaB.orOperator(Criteria.where("inventory_docs.asset_name").regex(pattern),
Criteria.where("asset_manager_lease.property_owner").regex(pattern),
Criteria.where("asset_manager_lease.asset_operator").regex(pattern),
Criteria.where("rental_location").regex(pattern),
Criteria.where("property_no").regex(pattern));
}
criteria.andOperator(criteriaA, criteriaB, criteriaC, criteriaD);
}

operations.add(Aggregation.match(criteria));

operations.add(Aggregation.sort(Sort.Direction.DESC, "asset_manager_lease.asset_operator", "_id"));
return operations;
}
//addPageCriteria()
public static List<AggregationOperation> addPageCriteria(Pageable pageable) {
long start = (pageable.getPageNumber() - 1) * pageable.getPageSize();

//设置排序
Sort sort = pageable.getSort();
List<AggregationOperation> operations = new ArrayList<>();
operations.add(Aggregation.skip(start));
operations.add(Aggregation.limit(pageable.getPageSize()));
if(!sort.isEmpty()) {
operations.add(Aggregation.sort(sort));
}
return operations;
}
 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM