SpringデータMongoDB - 集約グループ化の例

Spring Data MongoDB –集計グループ化の例

このチュートリアルでは、Spring Data + MongoDB集計フレームワークを使用してデータをグループ化する方法を示します。

1. テストデータ

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集約の例

ホスティングの総数を合計するMongoDB集約の例:

db.domain.aggregate(
    {
    $match : {_id:{$lt:10}}
    },
    {
    $group : {_id : "$hosting", total : { $sum : 1 }}
    },
    {
    $sort : {total : -1}
    }
);

出力

{ "_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集約の例

これは、Spring Data MongoDBの同等の例です。

DomainDaoImpl.java

package com.example.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.example.core.domain.model.Domain;
import com.example.core.hosting.model.HostingCount;
import java.util.List;

@Repository
public class DomainDaoImpl implements DomainDao {

    @Autowired
    MongoTemplate mongoTemplate;

    public List 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 groupResults
            = mongoTemplate.aggregate(agg, Domain.class, HostingCount.class);
        List result = groupResults.getMappedResults();

        return result;

    }

HostingCount.java

package com.example.core.hosting.model;

public class HostingCount {

    private String hosting;

    private long total;

    //...
}

More Examples
この公式を参照してくださいSpring data – Aggregation Framework Support