簡體   English   中英

如何從Spring數據MongoDB中的AggregationOperation列表創建聚合?

[英]How to create an Aggregation from a list of AggregationOperation in Spring data MongoDB?

我想創建一個可在MongoOperations的gregation()函數中使用的聚合。 因此,為了創建聚合,我使用了AggregationOperation的列表,如下所示:

    ApplicationContext ctx = new AnnotationConfigApplicationContext(MongoConfig.class);
    MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate"); 

    List<AggregationOperation> aggregationOperations = new ArrayList<AggregationOperation>();
    aggregationOperations.add(new MatchOperation(Criteria.where("country").is("tigo")));
    aggregationOperations.add(new UnwindOperation(Fields.field("myDetails")));
    aggregationOperations.add(new MatchOperation(Criteria.where("myDetails.type").is("health")));
    aggregationOperations.add(new SortOperation(new Sort(Sort.Direction.ASC, "myDetails.datetime")));
    AggregationResults<AggregateFactoryResult> result = mongoOperation.aggregate(new Aggregation(aggregationOperations), "gui_data", AggregateFactoryResult.class);

但是這樣做,我在最后一行收到了編譯時錯誤,如下所示:

構造函數Aggregation(List)不可見

原因是因為Aggregation(List)構造函數具有受保護的訪問。 我可以通過AggregationOperation列表來創建聚合嗎? 有什么建議嗎?

這是運作良好的解決方案:

public static void checkMongoOperations(){
        ApplicationContext ctx = new AnnotationConfigApplicationContext(MongoConfig.class);
        MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate"); 

        AggregationOperation match = Aggregation.match(Criteria.where("country").is("tiro"));
        AggregationOperation unwind = Aggregation.unwind("myDetails");
        AggregationOperation match2 = Aggregation.match(Criteria.where("myDetails.type").is("health"));
        AggregationOperation sort = Aggregation.sort(Sort.Direction.ASC, "myDetails.datetime");
        AggregationOperation limit = Aggregation.limit(1);

        Aggregation aggregation = Aggregation.newAggregation(match, unwind, match2, sort, limit);
        System.out.println("Aggregation = "+aggregation);
        AggregationResults<AggregateFactoryResult> output = mongoOperation.aggregate(aggregation, "gui_data", AggregateFactoryResult.class);
        System.out.println("output = "+output.getMappedResults().get(0).getCountry());
    }

並且需要實現結果情況,即AggregationFactoryResult,如下所示:

package com.ex.mongo;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class AggregateFactoryResult {
    String date;
    String country;
    String operator;
    String server_ip;

    ArrayList<Details> details;

    public AggregateFactoryResult(String date, String country, String operator, String server_ip, ArrayList<Details> details){
        super();
        this.country = country;
        this.operator = operator;
        this.server_ip = server_ip;
        this.details = details;
    }

    public AggregateFactoryResult(){
        super();
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getOperator() {
        return operator;
    }

    public void setOperator(String operator) {
        this.operator = operator;
    }

    public String getServer_ip() {
        return server_ip;
    }

    public void setServer_ip(String server_ip) {
        this.server_ip = server_ip;
    }

    public ArrayList<Details> getDetails() {
        return details;
    }

    public void setDetails(ArrayList<Details> details) {
        this.details = details;
    }



}

class Details{
    String type;
    String datetime;
    ArrayList<Module> module;

    public Details(String type, String datetime){
        super();
        this.type = type;
        this.datetime = datetime;
        this.module = new ArrayList<Module>();
    }

    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getDatetime() {
        return datetime;
    }
    public void setDatetime(String datetime) {
        this.datetime = datetime;
    }
    public ArrayList<Module> getModule() {
        return module;
    }
    public void setModule(ArrayList<Module> module) {
        this.module = module;
    }

}

class Module{
    ArrayList<ModuleDetail> moduleDetail;

    public Module(ArrayList<ModuleDetail> moduleDetail){
        super();
        this.moduleDetail =  moduleDetail;
    }

    public ArrayList<ModuleDetail> getModuleDetail() {
        return moduleDetail;
    }

    public void setModuleDetail(ArrayList<ModuleDetail> moduleDetail) {
        this.moduleDetail = moduleDetail;
    }

}

class ModuleDetail{
    String module_name;
    String live;

    public ModuleDetail(String module_name, String live){
        super();
        this.module_name = module_name;
        this.live = live;
    }
    public String getModule_name() {
        return module_name;
    }
    public void setModule_name(String module_name) {
        this.module_name = module_name;
    }
    public String getLive() {
        return live;
    }
    public void setLive(String live) {
        this.live = live;
    }


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM