У меня есть этот запрос агрегации, который возвращает объекты Operation
с полем amount:BigDecimal
выше, чем minAmount
, и в пределах диапазона дат. Я хотел бы получить только отдельные результаты (каждый объект Operation
имеет operationId:String
) на основе operationId
.
Я нашел здесь соответствующий пример, но он не помог мне решить мою проблему: отсортированные отдельные значения с помощью MongoTemplate
Я понимаю, что можно использовать addToSet
или group
, но я не понимаю, как именно включить его в остальную часть запроса.
private List<OperationDataVO> getInfoFromDB(BigDecimal minAmount,
Instant startDate, Instant endDate) {
Criteria criterias = new Criteria()
.andOperator(Criteria.where(WinningOperation.AMOUNT)
.gte(minAmount)
.and(Operation.TYPE).is(OperationTypeEnum.WINNING_TYPE)
.and("createdAt").gte(startDate).lte(endDate));
MatchOperation matchOperation = Aggregation.match(criterias);
ProjectionOperation projectionOperation =
Aggregation.project("amount", "operationId");
Aggregation aggregation = Aggregation.newAggregation(matchOperation,
projectionOperation, sort(direction, "amount"));
AggregationResults<OperationDataVO> aggregate = mongoTemplate
.aggregate(aggregation, COLLECTION, OperationDataVO.class);
return aggregate.getMappedResults();
}
Кроме того, я пытался добавить групповую операцию в конвейер Aggregation
, но когда я это делаю, я получаю список OperationDataVO
, где оба поля каждого объекта null
(Aggregation aggregation = Aggregation.newAggregation(matchOperation, projectionOperation, sort(direction, "amount"), group("operationId"));
)
operationId
, какой из них вы хотите вернуть? - person herman   schedule 23.06.2020operationId
, отсортировать каждую группу по убыванию поamount
, а затем получить первую из каждой группы. - person herman   schedule 23.06.2020OperationDataVO
? Толькоamount
иoperationId
? И все отсортировано по возрастанию наamount
? - person herman   schedule 23.06.2020