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