以下是获取特定字段总和的方法。
private Map<String, Long> getTotalMap(){ /* db.pDSSummaryModel.aggregate([{ $group: { _id: null, total: { $sum: '$totalUniqueCustomerCount' } } }]) */ Aggregation aggregations = newAggregation( group("null").sum("totalUniqueUserCount").as("userTotal") .sum("totalUniqueCustomerCount").as("customerTotal"), project("customerTotal", "userTotal") ); AggregationResults<DBObject> results = mongoTemplate.aggregate(aggregations, "pDSSummaryModel", DBObject.class); List<DBObject> fieldList = results.getMappedResults(); Map<String, Long> map = new HashMap<>(); if(fieldList != null && !fieldList.isEmpty()) { for(DBObject db: fieldList){ map.put("userTotal", parseLong(db.get("userTotal").toString())); map.put("customerTotal", parseLong(db.get("customerTotal").toString())); } } return map; }
春季数据 MongoOperations.group() 方法映射到 db.collection.group() MongoDB命令而不是 $group 聚合功能。目前,Spring Data MongoDB不支持聚合框架。正如您所提到的,Map reduce虽然受到支持
MongoOperations.group()
db.collection.group()
$group
Aggregation aggregation = newAggregation( match(Criteria.where("salesyear").is(year)), group("brand","salesyear").sum("numberOfCars").as("total"), sort(Sort.Direction.ASC, previousOperation(), "brand") );
Spring Data 1.3.0.RC1可用,它确实支持聚合框架。
例如: shell聚合命令:
db.eft_transactions.aggregate( {$match: { service:"EFT", source:"MARKUP", } }, {$group: { _id:"$card_acceptor_id", tran_count:{$sum:1}, amount_sum:{$sum:"$amount"} } } )
从java运行如下:
AggregationOperation match = Aggregation.match(Criteria.where("service").is("EFT").and("source").is("MARKUP")); AggregationOperation group = Aggregation.group("card_acceptor").and("amount_sum").sum("amount").and("tran_count").count(); Aggregation aggregation = newAggregation(match, group); AggregationResults<StoreSummary> result = this.mongoTemplate.aggregate(aggregation, "eft_transactions", StoreSummary.class);
文档是 这里
注意:我们最近不得不切换到使用版本1.3.0的BUILD-SNAPSHOT版本。此更改需要更改上述两行已更改为:
AggregationOperation group = Aggregation.group("card_acceptor").sum("amount").as("amount_sum").count().as("tran_count"); Aggregation aggregation = Aggregation.newAggregation(match, group);