Spring Data MongoDB Aggregation Grouping Example
By:Roy.LiuLast updated:2019-08-17
In this tutorial, we will show you how to do the data grouping with Spring Data + MongoDB aggregation framework.
1. Test Data
domain.json
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" } { "_id" : 2, "domainName" : "test2.com", "hosting" : "aws.amazon.com"} { "_id" : 3, "domainName" : "test3.com", "hosting" : "aws.amazon.com" } { "_id" : 4, "domainName" : "test4.com", "hosting" : "hostgator.com" } { "_id" : 5, "domainName" : "test5.com", "hosting" : "aws.amazon.com" } { "_id" : 6, "domainName" : "test6.com", "hosting" : "cloud.google.com" } { "_id" : 7, "domainName" : "test7.com", "hosting" : "aws.amazon.com" } { "_id" : 8, "domainName" : "test8.com", "hosting" : "hostgator.com" } { "_id" : 9, "domainName" : "test9.com", "hosting" : "cloud.google.com" } { "_id" : 10, "domainName" : "test10.com", "hosting" : "godaddy.com" } ... { "_id" : 100, "domainName" : "test10.com", "hosting" : "godaddy.com" }
2. MongoDB Aggregation Example
MongoDB aggregation example to sum the total number of hosting :
db.domain.aggregate( $match : {_id:{$lt:10}} }, { $group : {_id : "$hosting", total : { $sum : 1 }} }, $sort : {total : -1} );
Output
{ "_id" : "aws.amazon.com", "total" : 4 } { "_id" : "hostgator.com", "total" : 3 } { "_id" : "cloud.google.com", "total" : 2 } { "_id" : "godaddy.com", "total" : 1 }
2. Spring Data + MongoDB Aggregation Example
This is the equivalent example in Spring Data MongoDB.
DomainDaoImpl.java
package com.mkyong.core.domain.dao; //imports as static import static org.springframework.data.mongodb.core.aggregation.Aggregation.group; import static org.springframework.data.mongodb.core.aggregation.Aggregation.match; import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation; import static org.springframework.data.mongodb.core.aggregation.Aggregation.project; import static org.springframework.data.mongodb.core.aggregation.Aggregation.sort; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Repository; import com.mkyong.core.domain.model.Domain; import com.mkyong.core.hosting.model.HostingCount; import java.util.List; @Repository public class DomainDaoImpl implements DomainDao { @Autowired MongoTemplate mongoTemplate; public List<HostingCount> getHostingCount() { Aggregation agg = newAggregation( match(Criteria.where("_id").lt(10)), group("hosting").count().as("total"), project("total").and("hosting").previousOperation(), sort(Sort.Direction.DESC, "total") ); //Convert the aggregation result into a List AggregationResults<HostingCount> groupResults = mongoTemplate.aggregate(agg, Domain.class, HostingCount.class); List<HostingCount> result = groupResults.getMappedResults(); return result;
HostingCount.java
package com.mkyong.core.hosting.model; public class HostingCount { private String hosting; private long total; //...
More Examples
Refer to this official Spring data – Aggregation Framework Support
Refer to this official Spring data – Aggregation Framework Support
References
- MongoDB – Aggregation Concepts
- MongoDB – Aggregate And Group Example
- Spring.io – Aggregation Framework Support
From:一号门
COMMENTS