Agregações avançadas do MongoDB com Spring Boot e Amazon Corretto
Aasawari Sahasrabuddhe5 min read • Published Jun 26, 2024 • Updated Jun 26, 2024
APLICATIVO COMPLETO
Avalie esse Tutorial
Neste tutorial, entenderemos as aggregations e exploraremos como construir pipelines de aggregation dentro de seus aplicativos Spring Boot.
Se você é novo no Spring Boot, é aconselhável entender os fundamentos familiarizando-se com o modelo de exemplo fornecido para executar operações de Criar, Ler, Atualizar, Excluir (CRUD) com Spring Boot e MongoDB antes de mergulhar em conceitos avançados de agregação .
Este tutorial serve como complemento ao exemplo de modelo de código acessível no repositório do GitHub. O código utiliza dados de exemplo, que serão introduzidos mais tarde no tutorial.
Conforme indicado no título do tutorial, compilaremos o código Java usando o Amazon Corretho.
Recomendamos seguir o tutorial cuidadosamente, avançando em cada estágio do processo de criação do aggregation pipeline.
Vamos nessa!
Este tutorial segue algumas especificações mencionadas abaixo. Antes de começar a praticá-lo, certifique-se de ter todos os downloads e uploads necessários em seu ambiente.
- Uma camada Atlas gratuita, também conhecida como cluster M0 .
- Dados de amostra carregados no cluster.
- Versão do Spring Data 4.2.2.
- MongoDB versão 6.0.3.
- MongoDB Java Driver versão 4.11.1.
Vamos entender cada um deles em detalhes.
O Corretto vem com a capacidade de ser um JDK aberto sem custo, multiplataforma e pronto para produção. Ele também oferece a capacidade de trabalhar em várias distribuições de Linux, Windows e macOS.
Você pode ler mais sobre o Amazon Corretto em Introdução ao Amazon Corretto: uma distribuição gratuita do OpenJDK.
Iniciaremos o tutorial com a primeira etapa da instalação do Amazon Corretho 21 JDK e da configuração do seu IDE com o JDK correto.
Etapa 1: Instale o Amazon Corretto 21 do site oficial com base nas especificações do sistema operacional.
Passo 2: Se você estiver no macOS, precisará definir a variável JAVA_HOME com o caminho para o Corretto. Para fazer isso, Go até o terminal do sistema e defina a variável JAVA_HOME como:
1 export JAVA_HOME=/Library/Java/JavaVirtualMachines/amazon-corretto-21.jdk/Contents/Home
Depois que a variável for definida, você deve verificar se a instalação foi feita corretamente usando:
1 java --version 2 openjdk 21.0.2 2024-01-16 LTS 3 OpenJDK Runtime Environment Corretto-21.0.2.13.1 (build 21.0.2+13-LTS) 4 OpenJDK 64-Bit Server VM Corretto-21.0.2.13.1 (build 21.0.2+13-LTS, mixed mode, sharing)
Para qualquer outro sistema operacional, será necessário seguir as etapas mencionadas na documentação oficial do Java sobre como definir ou alterar a variável de sistema PATH e verificar se a versão foi definida.
Depois que o JDK estiver instalado no sistema, você poderá configurar seu IDE de escolha para usar o Amazon Corretho para compilar o código.
Neste ponto, você tem todos os componentes de ambiente necessários prontos para iniciar seu aplicativo.
Nesta parte do tutorial, vamos explorar como escrever queries de agregação para um aplicativo Spring Boot.
As agregações no MongoDB são como ferramentas superpotentes para fazer cálculos complexos em seus dados e obter resultados significativos. Eles funcionam aplicando diferentes operações aos seus dados e, em seguida, fornecendo os resultados de forma estruturada.
Mas antes de entrarmos em detalhes, vamos primeiro entender o que é um aggregation pipeline e como ele opera no MongoDB.
Pense em um pipeline de agregação como uma série de etapas ou estágios que o MongoDB segue para processar seus dados. Cada estágio do pipeline executa uma tarefa específica, como filtrar ou agrupar seus dados de uma determinada maneira. E, assim como um pipeline real, os dados fluem por cada estágio, com a saída de um estágio se tornando a entrada para o próximo. Isso permite que você construa operações complexas passo a passo para obter os resultados necessários.
Até agora, você deve ter os dados de amostra carregados em seu cluster Atlas. Neste tutorial, usaremos a coleção
sample_supplies.sales
para nossas queries de agregação.A próxima etapa é clonar o repositório a partir do link para testar as agregações. Você pode começar clonando o repositório usando o comando abaixo:
1 git clone https://github.com/mongodb-developer/spring-boot-mongodb-aggregations.git
Após a conclusão da etapa acima, ao bifurcar e clonar o repositório em seu ambiente local, é essencial atualizar a string de conexão no espaço reservado designado no arquivo
application.properties
. Essa modificação permite uma conectividade perfeita com seu cluster durante a execução do projeto.Depois de clonar o repositório e alterar o URI nas variáveis de ambiente, você pode tentar executar as APIs REST em seu aplicativo Postman.
Todas as informações e comandos extras de que você precisa para realizar esse projeto estão no arquivoREADME.md, que você pode ler no GitHub.
O suporte ao Aggregation Framework no Spring Data MongoDB é baseado nas seguintes abstrações principais:
- Agregação
- AggregationDefinition
- AggregationResults
O suporte ao Aggregation Framework no Spring Data MongoDB é baseado nas seguintes abstrações de chave: Aggregation, AggregationDefinition e AggregationResults.
Ao escrever as consultas de agregação, a primeira etapa é gerar os pipelines para executar os cálculos usando as operações suportadas.
A documentação no Spring.io explica cada etapa com clareza e fornece exemplos simples para ajudá-lo a entender.
Para o tutorial, temos as REST API definidas na classeSalesController.java e os métodos foram mencionados na classeSalesRepository.java.
A primeira agregação utiliza uma simples operação$match para localizar todos os documentos onde o
storeLocation
foi especificado como o valor de correspondência.1 db.sales.aggregate([{ $match: { "storeLocation": "London"}}])
E agora, quando convertemos a agregação para a função de inicialização de primavera, ela ficaria assim:
1 @Override 2 public List<SalesDTO> matchOp(String matchValue) { 3 MatchOperation matchStage = match(new Criteria("storeLocation").is(matchValue)); 4 Aggregation aggregation = newAggregation(matchStage); 5 AggregationResults<SalesDTO> results = mongoTemplate.aggregate(aggregation, "sales", SalesDTO.class); 6 return results.getMappedResults(); 7 }
Neste método do Spring Boot, utilizamos o
MatchOperation
para filtrar documentos com base nos critérios especificados, que neste caso é o storeLocation
que corresponde ao valor fornecido. A aggregation é então executada usando o mongoTemplate
para agregar dados da collection sales
em objetosSalesDTO
, retornando os resultados mapeados.A REST API pode ser testada usando o comando curl no terminal, que mostra todos os documentos em que
storeLocation
está London
.O próximo pipeline de agregação que definimos com a REST API é agrupar todos os documentos de acordo com
storeLocation
e, em seguida, calcular o total de vendas e a média de satisfações com base no matchValue
. Este estágio utiliza o GroupOperation
para realizar a avaliação.1 @Override 2 public List<GroupDTO> groupOp(String matchValue) { 3 MatchOperation matchStage = match(new Criteria("storeLocation").is(matchValue)); 4 GroupOperation groupStage = group("storeLocation").count() 5 .as("totalSales") 6 .avg("customer.satisfaction") 7 .as("averageSatisfaction"); 8 ProjectionOperation projectStage = project("storeLocation", "totalSales", "averageSatisfaction"); 9 Aggregation aggregation = newAggregation(matchStage, groupStage, projectStage); 10 AggregationResults<GroupDTO> results = mongoTemplate.aggregate(aggregation, "sales", GroupDTO.class); 11 return results.getMappedResults(); 12 }
A chamada da REST API teria a seguinte aparência:
1 curl http://localhost:8080/api/sales/aggregation/groupStage/Denver | jq
A próxima REST API é uma extensão que simplificará a agregação acima. Nesse caso, calcularemos o total de vendas para cada loja. Portanto, você não precisa especificar o local da loja e obter diretamente o valor de todos os locais.
1 @Override 2 public List<TotalSalesDTO> TotalSales() { 3 GroupOperation groupStage = group("storeLocation").count().as("totalSales"); 4 SkipOperation skipStage = skip(0); 5 LimitOperation limitStage = limit(10); 6 Aggregation aggregation = newAggregation(groupStage, skipStage, limitStage); 7 AggregationResults<TotalSalesDTO> results = mongoTemplate.aggregate(aggregation, "sales", TotalSalesDTO.class); 8 return results.getMappedResults(); 9 }
E as chamadas da REST API têm a seguinte aparência:
1 curl http://localhost:8080/api/sales/aggregation/TotalSales | jq
1 @Override 2 public List<PopularDTO> findPopularItems() { 3 UnwindOperation unwindStage = unwind("items"); 4 GroupOperation groupStage = group("$items.name").sum("items.quantity").as("totalQuantity"); 5 SortOperation sortStage = sort(Sort.Direction.DESC, "totalQuantity"); 6 LimitOperation limitStage = limit(5); 7 Aggregation aggregation = newAggregation(unwindStage,groupStage, sortStage, limitStage); 8 return mongoTemplate.aggregate(aggregation, "sales", PopularDTO.class).getMappedResults(); 9 }
1 curl http://localhost:8080/api/sales/aggregation/PopularItem | jq
A última API mencionada usa o $bucket para criar buckets e, em seguida, calcula a contagem e o valor total gasto em cada bucket.
1 @Override 2 public List<BucketsDTO> findTotalSpend(){ 3 ProjectionOperation projectStage = project() 4 .and(ArrayOperators.Size.lengthOfArray("items")).as("numItems") 5 .and(ArithmeticOperators.Multiply.valueOf("price") 6 .multiplyBy("quantity")).as("totalAmount"); 7 8 BucketOperation bucketStage = bucket("numItems") 9 .withBoundaries(0, 3, 6, 9) 10 .withDefaultBucket("Other") 11 .andOutputCount().as("count") 12 .andOutput("totalAmount").sum().as("totalAmount"); 13 14 Aggregation aggregation = newAggregation(projectStage, bucketStage); 15 return mongoTemplate.aggregate(aggregation, "sales", BucketsDTO.class).getMappedResults(); 16 }
1 curl http://localhost:8080/api/sales/aggregation/buckets | jq
Este tutorial fornece uma visão geral abrangente das agregações no MongoDB e como implementá-las em um aplicativo Spring Boot. Avaliamos a importância das queries de agregação para realizar cálculos complexos em conjuntos de dados, aproveitando o pipeline de agregação do MongoDB para simplificar esse processo de forma eficaz.
À medida que você continua experimentando e aplicando esses conceitos em seus aplicativos, fique à vontade para entrar em contato nos fóruns da comunidade doMongoDB . Lembre-se de explorar mais recursos no Centro do Desenvolvedor doMongoDB e nadocumentação para afundar sua compreensão e refinar suas habilidades no trabalho com agregações do MongoDB .
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.