Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Idiomaschevron-right
Javachevron-right

Agregações avançadas do MongoDB com Spring Boot e Amazon Corretto

Aasawari Sahasrabuddhe5 min read • Published Jun 26, 2024 • Updated Jun 26, 2024
SpringMongoDBFramework de agregaçãoJava
APLICATIVO COMPLETO
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty

Introdução

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!

Pré-requisitos

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.
  1. Uma camada Atlas gratuita, também conhecida como cluster M0 .
  2. Versão do Spring Data 4.2.2.
  3. MongoDB versão 6.0.3.
  4. MongoDB Java Driver versão 4.11.1.
Vamos entender cada um deles em detalhes.

Noções básicas sobre e instalação do Correto

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:
1export 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:
1java --version
2openjdk 21.0.2 2024-01-16 LTS
3OpenJDK Runtime Environment Corretto-21.0.2.13.1 (build 21.0.2+13-LTS)
4OpenJDK 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.

Criando o aplicativo Spring Boot

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çãosample_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:
1git 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 arquivoapplication.properties. Essa modificação permite uma conectividade perfeita com seu cluster durante a execução do projeto.

README

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.

Escrevendo queries de agregação na primavera

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.
1db.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
2public List<SalesDTO> matchOp(String matchValue) {
3MatchOperation matchStage = match(new Criteria("storeLocation").is(matchValue));
4Aggregation aggregation = newAggregation(matchStage);
5AggregationResults<SalesDTO> results = mongoTemplate.aggregate(aggregation, "sales", SalesDTO.class);
6return 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 salesem 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
2public List<GroupDTO> groupOp(String matchValue) {
3MatchOperation matchStage = match(new Criteria("storeLocation").is(matchValue));
4GroupOperation groupStage = group("storeLocation").count()
5 .as("totalSales")
6 .avg("customer.satisfaction")
7 .as("averageSatisfaction");
8ProjectionOperation projectStage = project("storeLocation", "totalSales", "averageSatisfaction");
9Aggregation aggregation = newAggregation(matchStage, groupStage, projectStage);
10AggregationResults<GroupDTO> results = mongoTemplate.aggregate(aggregation, "sales", GroupDTO.class);
11return results.getMappedResults();
12}
A chamada da REST API teria a seguinte aparência:
1curl http://localhost:8080/api/sales/aggregation/groupStage/Denver | jq
Total de vendas e a média de satisfações para storeLocation as "Denver"
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
2public List<TotalSalesDTO> TotalSales() {
3GroupOperation groupStage = group("storeLocation").count().as("totalSales");
4SkipOperation skipStage = skip(0);
5LimitOperation limitStage = limit(10);
6Aggregation aggregation = newAggregation(groupStage, skipStage, limitStage);
7AggregationResults<TotalSalesDTO> results = mongoTemplate.aggregate(aggregation, "sales", TotalSalesDTO.class);
8return results.getMappedResults();
9}
E as chamadas da REST API têm a seguinte aparência:
1curl http://localhost:8080/api/sales/aggregation/TotalSales | jq
Total de vendas para cada localização de loja
A próxima API utiliza as operações$sort e $limit para calcular os 5 itens mais vendidos em cada categoria.
1@Override
2public List<PopularDTO> findPopularItems() {
3UnwindOperation unwindStage = unwind("items");
4GroupOperation groupStage = group("$items.name").sum("items.quantity").as("totalQuantity");
5SortOperation sortStage = sort(Sort.Direction.DESC, "totalQuantity");
6LimitOperation limitStage = limit(5);
7Aggregation aggregation = newAggregation(unwindStage,groupStage, sortStage, limitStage);
8return mongoTemplate.aggregate(aggregation, "sales", PopularDTO.class).getMappedResults();
9}
1curl http://localhost:8080/api/sales/aggregation/PopularItem | jq
5 itens mais vendidos em cada categoria
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
2public List<BucketsDTO> findTotalSpend(){
3ProjectionOperation projectStage = project()
4 .and(ArrayOperators.Size.lengthOfArray("items")).as("numItems")
5 .and(ArithmeticOperators.Multiply.valueOf("price")
6 .multiplyBy("quantity")).as("totalAmount");
7
8BucketOperation bucketStage = bucket("numItems")
9 .withBoundaries(0, 3, 6, 9)
10 .withDefaultBucket("Other")
11 .andOutputCount().as("count")
12 .andOutput("totalAmount").sum().as("totalAmount");
13
14Aggregation aggregation = newAggregation(projectStage, bucketStage);
15return mongoTemplate.aggregate(aggregation, "sales", BucketsDTO.class).getMappedResults();
16}
1curl http://localhost:8080/api/sales/aggregation/buckets | jq
calcula a contagem e o valor total gasto em cada intervalo

Conclusão

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.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Construindo um Painel de Vendas Dinâmico e em Tempo Real no MongoDB


Aug 05, 2024 | 7 min read
Tutorial

Como se conectar ao MongoDB com um proxy SOCKS5 com Java


Aug 29, 2024 | 2 min read
Tutorial

Gerador de lista de reprodução alimentada por IA: criando visualizações personalizadas com aprendizagem profunda4j e MongoDB


Oct 25, 2024 | 14 min read
Tutorial

Spring Data Unlocked: Advanced Queries With MongoDB


Nov 08, 2024 | 7 min read
Sumário