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
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:
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:
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:
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?
Um filtro inicial pode reduzir o volume que chega a group, project e sort. O efeito real deve ser confirmado com dados e plano de execução.
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 →