How to group and aggregate child items in MongoDB?

1

I'm developing a Web Services REST application with Spring Boot and need to group the goals by players in order to show the scorers from the following records:

[
  {
    "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
      }
    ]
  }
]

I want to get the following output:

[
   {
      "jogador": {
         "nome": "Murillo"
      },
      "totalGols": 18
   },
   {
      "jogador": {
         "nome": "Eduardo"
      },
      "totalGols": 9
   }
]
    
asked by anonymous 13.02.2017 / 20:20

1 answer

0

After much research and testing, I came to the result as follows:

@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();
    }

}

Below the source classes ( Start ) of the cluster:

@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

}

And target ( Scorer ) of the grouping.

public class Goleador {

    private String jogador;

    private Integer totalGols;

    //Getters e Setters omitidos
}
    
14.02.2017 / 17:06