Я использую Агрегацию, чтобы получить Среднее и Максимальное значение из цены в селе.для этого я написал следующий код.
public void getComparisonSheet(GetComparisonSheetRequest getComparisonSheet, BasicResponse response,
String requestFarmerId) {
Farmer farmer = this.getFarmerById(requestFarmerId);
// get logs before this year...
String villageId = farmer.getVillageId();
Criteria criteria = Criteria.where(FarmerCropDataLog.Constants.CROP_LOG).is(getComparisonSheet.getCrop().name())
.and(FarmerCropDataLog.Constants.VILLAGE_ID).is(villageId)
.and(FarmerCropDataLog.Constants.CREATION_TIME).gt(LAST_YEAR);
MatchOperation matchOperation = Aggregation.match(criteria);
Fields fields = Fields.fields(CropData.Constants.CROP_PRICE,FarmerCropDataLog.Constants.VILLAGE_ID);
ProjectionOperation projectionOperation = Aggregation.project(fields);
Fields groupFields = Fields.fields(FarmerCropDataLog.Constants.VILLAGE_ID);
GroupOperation groupOperation = Aggregation.group(groupFields);
groupOperation.avg(CropData.Constants.CROP_PRICE).as(GetComparisonSheetResponse.Constants.AVERAGE);
groupOperation.max(CropData.Constants.CROP_PRICE).as(GetComparisonSheetResponse.Constants.MAX_INCOME);
LimitOperation limitOperation = new LimitOperation(MAX_RESULTS);
AggregationOptions aggregationOptions = Aggregation.newAggregationOptions().allowDiskUse(true).explain(false).cursor(new BasicDBObject()).build();
Aggregation aggregation = Aggregation.newAggregation(matchOperation, projectionOperation, groupOperation
,limitOperation).withOptions(aggregationOptions);
AggregationResults<GetComparisonSheetResponse> aggregationResults = farmerCropDataLogDAO
.runAggregation(aggregation, FarmerCropDataLog.class, GetComparisonSheetResponse.class);
List<GetComparisonSheetResponse> comparisonSheetResponses = aggregationResults.getMappedResults();
response.setResponse(comparisonSheetResponses);
response.setSuccess(true);
}
Это моя структура сущности FarmerCropDataLog.
public class FarmerCropDataLog extends AbstractEntity {
private String farmerId;
private CropData cropData;
private String villageId;
}
, как вы можете видеть из кода, сначала он находит все сущности по villageId,Время создания и урожай, затем он проецируется на villageId и cropPrice, и, наконец, группируя это на villageId, я определяю средний и максимальный доход для конкретной деревни, но возвращаю результат, он пустой.