Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA

Aula 5 de 6

Agregação e índices no MongoDB sem adivinhação

Resuma documentos com um pipeline de agregação e escolha índices a partir de filtros e ordenações reais, conferindo o plano de execução.

58 minutos · leitura + prática · nível iniciante

Ao terminar esta aula, você vai conseguir

  • Ler um pipeline como sequência de transformações
  • Agrupar documentos e calcular contagem e média
  • Relacionar filtros e ordenações a índices simples e compostos
Três documentos independentes guardam nome e estado ativo.

Uma consulta encontra documentos; uma agregação pode filtrar, transformar, agrupar e resumir vários documentos. Nesta aula, você vai calcular uma visão por área e depois planejar um índice para uma consulta frequente. O resultado é uma decisão explicada, não a regra “crie índice em todo campo”.

Pense numa linha de preparo: primeiro chegam todos os pedidos, depois você separa os ativos, agrupa por categoria e calcula totais. Cada estação recebe a saída da anterior. No MongoDB, cada estágio do pipeline de agregação faz uma transformação. O limite da analogia é que o servidor pode otimizar partes do pipeline, usar índices e executar estratégias internas diferentes da sequência física imaginada.

Leia o pipeline uma etapa por vez

Este pipeline resume cursos ativos por área:

javascript
db.cursos.aggregate([
  { $match: { ativo: true } },
  {
    $group: {
      _id: '$area',
      quantidade: { $sum: 1 },
      mediaHoras: { $avg: '$cargaHoras' }
    }
  },
  { $sort: { quantidade: -1, _id: 1 } }
])

$match filtra. $group cria um grupo para cada valor de area; o _id do grupo não é o _id original do curso. $sum: 1 conta documentos e $avg calcula a média dos valores numéricos. $sort organiza a saída resumida.

Um erro reproduzível é mover { $match: { ativo: true } } para depois do $group. Nesse ponto, os documentos já não têm o campo ativo; a saída contém _id, quantidade e mediaHoras. O filtro deixa de representar a pergunta e pode retornar nada. Cada estágio precisa usar os campos disponíveis naquele momento.

Índice é um caminho extra de leitura

Um índice mantém uma estrutura ordenada para o servidor localizar valores sem examinar todos os documentos. É parecido com o índice remissivo de um livro: você encontra o assunto sem virar página por página. A comparação termina quando chega o custo: cada escrita precisa atualizar também os índices, e eles ocupam memória e armazenamento.

Para uma tela que filtra ativo e ordena por nota, um candidato seria:

javascript
db.cursos.createIndex({ ativo: 1, nota: -1 })

A ordem dos campos importa. O prefixo ativo atende ao filtro de igualdade e nota acompanha a ordenação. Isso não garante que o índice será escolhido em qualquer volume ou distribuição. Consultas diferentes podem pedir outro índice.

Um índice composto também pode atender consultas que usam seu prefixo inicial. O índice { ativo: 1, nota: -1 } ajuda a procurar por ativo; não oferece o mesmo caminho para uma consulta apenas por nota. Por isso, copiar a ordem dos campos sem olhar filtros reais cria estruturas que ocupam espaço e não resolvem a busca pretendida.

Confira o plano em vez de confiar no nome

Use explain na consulta que existe de verdade:

javascript
db.cursos
  .find({ ativo: true })
  .sort({ nota: -1 })
  .explain('executionStats')

Observe o plano, documentos examinados e resultados devolvidos. Em uma coleção minúscula, examinar tudo pode ser barato; índices mostram valor quando o volume e a seletividade crescem. Meça num conjunto representativo.

Compare totalDocsExamined com nReturned e observe se aparece uma varredura de coleção ou de índice. Nenhuma métrica isolada prova desempenho: tempo de disco, cache, tamanho do resultado e concorrência também influenciam. O plano serve para testar a hipótese “este índice ajuda esta consulta”.

Índice unique também aplica uma restrição. Tentar criá-lo quando já existem valores duplicados produz erro. Antes de createIndex({ slug: 1 }, { unique: true }), descubra e trate duplicatas. Não apague registros só para fazer o comando passar sem conhecer a regra do negócio.

Revise índices ao longo do tempo. Um índice não usado continua cobrando custo em inserções e atualizações. Antes de remover, verifique métricas e dependências em ambiente controlado; o objetivo é manter caminhos de leitura que correspondam ao produto atual.

O simulador das outras aulas não executa agregação, criação de índice ou explain; ele filtra arrays JSON no navegador. Sua missão aqui é calcular manualmente o resultado do pipeline para quatro cursos, escrever a saída esperada e justificar um índice com a frase “filtro por…, ordeno por…”. Na próxima aula, todas essas decisões formarão um catálogo verificável.

Pare e pense

Por que colocar $match cedo no pipeline costuma ajudar?

Escolha uma resposta
Missão da aula

Faça sem copiar

Escreva um pipeline que filtre cursos ativos, agrupe por nível e conte itens. Depois proponha um índice para o filtro e justifique a ordem dos campos.

Fontes para consultar

Terminou a missão?

Marque apenas quando você conseguir explicar o conceito e concluir o desafio. O progresso fica salvo somente neste navegador.

Próxima: Projeto MongoDB: catálogo de cursos pesquisável →