![](/img/trans.png)
[英]Create Spring Data Aggregation from MongoDb aggregation query
[英]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.