Spring Data MongoDB – Aggregation Grouping Example
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
May yuo give me source code of this example please?.Unfortunately id doesn’t work for me. It give null result without any errors
What is the Domain class
Can you please add the Domain class
I don’t want to give limit how should I do it.
does aggregation works with spring data mongodb in fields of nested array using DBREF?
I tried first aggregation of mongodb shell and I find that it does not work with references
hi, i got this error
errmsg” : “exception: aggregation result exceeds maximum document size (16MB)
use the $AllowDiskUse in the Aggregation Query
I am getting this error. Please help
java.lang.NoClassDefFoundError: org/springframework/data/mongodb/core/aggregation/AggregationOperation
Ok. I solved my problem. I just commended ” match(Criteria.where(“_id”).lt(10))” May be it doesn’t work for me because i have LongNumber id