Я использую spring-data-mongodb v1.10.3
Совокупный запрос работает в cli / robo3t, но я не могу перевести его в Spring.
db.getCollection('transaction').aggregate(
[
{
$match : {
effectiveDate : {
$gte : ISODate("2018-09-06T04:00:00.000Z") , // Spring aggregation puts these clauses as $gte : { $date: <date> }
$lte : ISODate("2018-09-11T03:59:59.000Z")
} ,
status : "external_received"}
}
,
{
$group : {
_id : { portfolio : "$portfolio" , processor : "$processor" , transactionType : "$transactionType"} ,
amount : { $sum : "$amount"}
}
}
]
)
Код Spring «работает» в том смысле, что он не выдает никаких ошибок, однако возвращает пустой результат.
public List<TransactionReport> getTransactionReport(Date begin, Date end) {
Aggregation aggregation = portfolioAggregation(begin, end);
System.out.println(aggregation.toString());
AggregationResults<TransactionReport> results = mongoTemplate.aggregate(aggregation, Transaction.class, TransactionReport.class);
return results.getMappedResults();
}
private Aggregation portfolioAggregation(Date begin, Date end) {
Criteria f = Criteria.where("effectiveDate").gte(begin).lte(end).and("status").is("received");
MatchOperation filter = match(f);
GroupOperation groupOperation = group("portfolio", "processor", "transactionType").sum("amount").as("amount");
return Aggregation.newAggregation(filter, groupOperation).withOptions(Aggregation.newAggregationOptions().cursor(getCursor()).build());
}
private DBObject getCursor() {
DBObject cursor = new BasicDBObject();
cursor.put("batchSize", 10);
return cursor;
}
Обновление:
Spring Code возвращает фактический результат в results.getRawResults()
Структура {"cursor": {firstBatch: [<result>,...,<result>]}}
По-прежнему изыскиваем способ сериализации результатов в классе TransactionReport элегантно