2017-02-13 7 views
0

Я создаю веб-службу REST с Spring ботинком и мне нужно цели группы по футболисту, чтобы показать высшие оценки из следующих документов:Группа и сумма вложенных предметов MongoDB?

[ 
    { 
    "id": 1, 
    "adversario": "Dois irmãos", 
    "dataRealizacao": "2017-02-03", 
    "golsPro": 10, 
    "golsContra": 3, 
    "jogadoresGols": [ 
     { 
     "jogador": { 
      "nome": "Murillo" 
     }, 
     "numeroGols": 6 
     }, 
     { 
     "jogador": { 
      "nome": "Eduardo" 
     }, 
     "numeroGols": 4 
     } 
    ] 
    }, 
    { 
    "id": 2, 
    "adversario": "Amigos Greminho", 
    "dataRealizacao": "2017-02-13", 
    "golsPro": 17, 
    "golsContra": 1, 
    "jogadoresGols": [ 
     { 
     "jogador": { 
      "nome": "Murillo" 
     }, 
     "numeroGols": 12 
     }, 
     { 
     "jogador": { 
      "nome": "Eduardo" 
     }, 
     "numeroGols": 5 
     } 
    ] 
    } 
] 

мне нужно получить следующий вывод:

[ 
    { 
     "jogador": { 
     "nome": "Murillo" 
     }, 
     "totalGols": 18 
    }, 
    { 
     "jogador": { 
     "nome": "Eduardo" 
     }, 
     "totalGols": 9 
    } 
] 

Этот код не работает:

@Repository 
public class GoleadorRepository { 

    private final MongoTemplate mongoTemplate; 

    @Autowired 
    public GoleadorRepository(MongoTemplate mongoTemplate) { 
     this.mongoTemplate = mongoTemplate; 
    } 

    public List<Goleador> list() { 
     SortOperation sortOperation = buildSortOpertation(); 
     GroupOperation groupOperation = buildGroupOperation(); 

     return mongoTemplate.aggregate(Aggregation.newAggregation(
       sortOperation, 
       groupOperation 
     ), Partida.class, Goleador.class).getMappedResults(); 
    } 

    private GroupOperation buildGroupOperation() { 
     return group("jogadoresGols.jogador.nome") 
       .first("jogadoresGols.jogador.nome").as("jogador") 
       .sum("jogadoresGols.jogador.numeroGols").as("totalGols"); 
    } 

    private SortOperation buildSortOpertation() { 
     return sort(Sort.Direction.DESC, "numeroGols"); 
    } 

} 

Я получаю следующее сообщение об ошибке:

org.springframework.data.mapping.context.InvalidPersistentPropertyPath: No property numeroGols found on br.com.cwidevs.domain.Jogador! 
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:262) ~[spring-data-commons-1.13.0.RELEASE.jar:na] 
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:235) ~[spring-data-commons-1.13.0.RELEASE.jar:na] 
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:222) ~[spring-data-commons-1.13.0.RELEASE.jar:na] 
    at org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext.getReferenceFor(TypeBasedAggregationOperationContext.java:98) ~[spring-data-mongodb-1.10.0.RELEASE.jar:na] 
    at org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext.getReference(TypeBasedAggregationOperationContext.java:93) ~[spring-data-mongodb-1.10.0.RELEASE.jar:na] 
    at org.springframework.data.mongodb.core.aggregation.GroupOperation$Operation.getValue(GroupOperation.java:478) ~[spring-data-mongodb-1.10.0.RELEASE.jar:na] 
    at org.springframework.data.mongodb.core.aggregation.GroupOperation$Operation.toDBObject(GroupOperation.java:460) ~[spring-data-mongodb-1.10.0.RELEASE.jar:na] 
    at org.springframework.data.mongodb.core.aggregation.GroupOperation.toDBObject(GroupOperation.java:408) ~[spring-data-mongodb-1.10.0.RELEASE.jar:na] 
    at org.springframework.data.mongodb.core.aggregation.AggregationOperationRenderer.toDBObject(AggregationOperationRenderer.java:56) ~[spring-data-mongodb-1.10.0.RELEASE.jar:na] 
    at org.springframework.data.mongodb.core.aggregation.Aggregation.toDbObject(Aggregation.java:580) ~[spring-data-mongodb-1.10.0.RELEASE.jar:na] 
    at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1566) ~[spring-data-mongodb-1.10.0.RELEASE.jar:na] 
    at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1501) ~[spring-data-mongodb-1.10.0.RELEASE.jar:na] 
    at br.com.cwidevs.repository.GoleadorRepository.list(GoleadorRepository.java:38) ~[classes/:na] 
    at br.com.cwidevs.repository.GoleadorRepository$$FastClassBySpringCGLIB$$56b69c8f.invoke(<generated>) ~[classes/:na] 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721) ~[spring-aop-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ~[spring-tx-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656) ~[spring-aop-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at br.com.cwidevs.repository.GoleadorRepository$$EnhancerBySpringCGLIB$$9cb7ef5d.list(<generated>) ~[classes/:na] 
    at br.com.cwidevs.resource.GoleadorResource.getAll(GoleadorResource.java:25) ~[classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_111] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_111] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_111] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_111] 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) ~[spring-web-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) ~[spring-webmvc-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105) ~[spring-web-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) ~[spring-web-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) ~[spring-web-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111] 

jogador is Soccer

numeroGols is Goals

+0

Взгляните на этот answer.http: // StackOverflow. ком/вопросы/41346329/получение-нуль-указатель исключения монго-агрегация с использованием пружинным-datadynamic поле/41346683 # 41346683 – Veeram

ответ

1

После долгих поисков я нашел результат следующим образом:

@Repository 
public class GoleadorRepository { 

    private final MongoTemplate mongoTemplate; 

    @Autowired 
    public GoleadorRepository(MongoTemplate mongoTemplate) { 
     this.mongoTemplate = mongoTemplate; 
    } 

    public List<Goleador> list() { 
     return mongoTemplate.aggregate(Aggregation.newAggregation(
       unwind("jogadoresGols"), 
       group("jogadoresGols.jogador.nome").sum("jogadoresGols.numeroGols").as("totalGols"), 
       project("totalGols").and("jogador").previousOperation(), 
       sort(Sort.Direction.DESC, "totalGols") 
     ), Partida.class, Goleador.class).getMappedResults(); 
    } 

} 

Ниже классов группировки:

@Document 
public class Partida { 

    @Id 
    private Long id; 

    private String adversario; 

    private LocalDate dataRealizacao; 

    private Integer golsPro; 

    private Integer golsContra; 

    private Set<JogadorGols> jogadoresGols; 

    //Getter e Setters omitidos 

} 

public class Goleador { 

    private String jogador; 

    private Integer totalGols; 

    //Getters e Setters omitidos 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^