Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 54 – API JavaScript, Node.js e Express – Aggregation Pipelines – MongoDB aggregation

Imagem destacada da aula de API

Introdução (3 min)

Imagine um chef de cozinha que precisa preparar um banquete. Ele não vai pegar cada ingrediente individualmente, um a um, para criar cada prato. Ele vai agrupar, fatiar, misturar e combinar os ingredientes de forma eficiente para criar pratos deliciosos. Aggregation Pipelines no MongoDB são como as técnicas de um chef: elas nos permitem processar e transformar dados de maneira eficiente e sofisticada.

Em APIs modernas, lidar com grandes volumes de dados e transformá-los em informações úteis é fundamental. Aggregation Pipelines são imprescindíveis para essa tarefa, permitindo análises complexas e respostas rápidas às requisições dos clientes.

Nesta aula, vamos construir uma API com Node.js e Express que utiliza Aggregation Pipelines para processar dados de uma coleção de produtos em um banco de dados MongoDB, simulando um cenário real de e-commerce. Veremos como calcular a média de preço, agrupar produtos por categoria e filtrar produtos com base em critérios específicos. Isso nos ajudará a entender o poder e a flexibilidade desta ferramenta essencial no contexto de desenvolvimento back-end.

Conceito Fundamental (7 min)

Aggregation Pipelines são uma framework de processamento de dados no MongoDB que opera em estágios. Cada estágio realiza uma transformação específica nos documentos de entrada, passando o resultado para o próximo estágio. Essa abordagem, similar a uma linha de produção, viabiliza a criação de consultas complexas de forma modular e organizada.

Utilizamos operadores específicos em cada estágio, como $match (para filtrar documentos), $group (para agrupar documentos), $project (para selecionar e transformar campos), $sort (para ordenar os resultados), entre outros. A terminologia é padronizada dentro do ecossistema MongoDB.

Em aplicações reais, Aggregation Pipelines são empregadas para gerar relatórios analíticos, calcular estatísticas, agregar dados de diferentes coleções, construir dashboards e otimizar consultas complexas. Elas se integram perfeitamente com outras tecnologias do ecossistema Node.js, como o driver MongoDB e o framework Express.

As principais vantagens das Aggregation Pipelines incluem a sua flexibilidade, eficiência e capacidade de processamento de grandes volumes de dados. Como desvantagem, a curva de aprendizado pode ser um pouco íngreme inicialmente, exigindo familiarização com os diversos operadores e estágios.

Implementação Prática (10 min)

const express = require('express');
const MongoClient = require('mongodb').MongoClient;

const app = express(); const url = 'mongodb://localhost:27017'; // URL do MongoDB (adapte para HostGator Plano M) const dbName = 'ecommerce'; const collectionName = 'produtos';

app.get('/produtos/relatorio', async (req, res) => { try { const client = new MongoClient(url); await client.connect(); const db = client.db(dbName); const collection = db.collection(collectionName);

const pipeline = [ { $match: { preco: { $gt: 10 } } }, // Filtra produtos com preço maior que 10 { $group: { _id: '$categoria', // Agrupa por categoria mediaPreco: { $avg: '$preco' }, // Calcula a média do preço totalProdutos: { $sum: 1 }, // Conta o número de produtos }, }, { $sort: { mediaPreco: -1 } }, // Ordena por média de preço (decrescente) ];

const resultado = await collection.aggregate(pipeline).toArray(); res.json(resultado); // Retorna o resultado em formato JSON client.close(); } catch (error) { console.error('Erro ao processar o relatório:', error); // Logging de erro res.status(500).json({ error: 'Erro interno do servidor' }); // Tratamento de erro } });

app.listen(3000, () => console.log('Servidor rodando na porta 3000'));

npm install express mongodb
// Insira dados de exemplo na coleção 'produtos' do banco 'ecommerce'
// Execute o servidor: node index.js

Exercício Hands-On (5 min)

Desafio: Modifique o código para adicionar um estágio que filtre produtos com quantidade em estoque menor que 50, além dos filtros já existentes.

Solução: Adicione o seguinte estágio $match antes do $group:

{ $match: { quantidade: { $lt: 50 } } }

Teste: Faça uma requisição GET para /produtos/relatorio. Verifique se o resultado inclui apenas produtos com preço maior que 10 e quantidade em estoque menor que 50.

Troubleshooting: Se o servidor não iniciar, verifique as dependências (express, mongodb) e a URL de conexão com o MongoDB. Certifique-se de que o banco de dados e a coleção existem e contêm dados.

Próximos Passos: Explore outros operadores de Aggregation Pipelines, como $lookup (para joins entre coleções), $unwind (para desnormalizar arrays) e $facet (para processamento paralelo). Experimente com diferentes combinações de estágios para criar relatórios e análises mais complexas.

🚀 Pronto para a próxima aula?

Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!

📚 Ver todas as aulas