How to group and aggregate child items in Mongodb?

Asked

Viewed 74 times

1

I am 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 wish to obtain the following output:

[
   {
      "jogador": {
         "nome": "Murillo"
      },
      "totalGols": 18
   },
   {
      "jogador": {
         "nome": "Eduardo"
      },
      "totalGols": 9
   }
]
  • I think you should iterate the query result in the application: filtering by name and incrementing the results (goals)

  • Like this: http://docs.spring.io/spring-data/data-mongo/docs/current/reference/html/#Mongo.group

1 answer

0


After much research and testing, I arrived at 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 (Departure) of grouping:

@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 fate (Scorer) of grouping.

public class Goleador {

    private String jogador;

    private Integer totalGols;

    //Getters e Setters omitidos
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.