Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA

Aula 4 de 6

Consultas MongoDB com filtros, projeção e paginação

Combine igualdade, comparação e conjuntos de valores, escolha campos da saída e ordene resultados para construir consultas previsíveis.

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

Ao terminar esta aula, você vai conseguir

  • Combinar campos e operadores de comparação em filtros
  • Limitar a saída com projeção, ordenação e quantidade
  • Reconhecer limites de paginação por deslocamento
Três documentos independentes guardam nome e estado ativo.

Consultar é transformar uma pergunta em filtro e definir como a resposta será apresentada. Nesta aula, você vai buscar cursos por faixa e nível, escolher os campos devolvidos, ordenar e limitar. O objetivo não é acumular operadores: é conseguir dizer, antes da execução, quais documentos devem aparecer.

Pense no filtro de uma loja. Você escolhe tamanho e faixa de preço, depois ordena por avaliação e decide quantos itens cabem na tela. No MongoDB, o documento de filtro estabelece as condições; projeção escolhe campos; sort, skip e limit organizam o cursor. A analogia termina aí: a eficiência depende de tipos, distribuição de dados, índices e do plano executado pelo servidor.

Combine igualdade e comparação

Dois campos no mesmo filtro formam um AND implícito:

javascript
db.cursos.find({
  nivel: 'iniciante',
  cargaHoras: { $gte: 5, $lte: 10 }
})

O curso precisa ter nível iniciante e carga entre 5 e 10, incluindo as pontas. $gt e $lt excluem os limites; $ne significa diferente; $in aceita qualquer valor presente numa lista:

javascript
db.cursos.find({
  nivel: { $in: ['iniciante', 'intermediario'] }
})

O tipo continua fazendo parte da comparação. Se cargaHoras foi salva como texto em alguns documentos, uma faixa numérica não corrige o modelo. Corrija a origem e migre os dados inconsistentes em vez de ampliar o filtro com casos acidentais.

Campos aninhados usam notação de ponto, como { 'instrutor.cidade': 'Recife' }. Arrays exigem atenção: uma comparação simples pode corresponder quando algum elemento tem o valor, enquanto condições sobre a mesma entrada de um array de objetos podem pedir $elemMatch. Leia a documentação do operador adequado e crie dados de teste com mais de um item; um único exemplo pode esconder uma correspondência incorreta.

Controle a forma da resposta

O segundo argumento de find pode projetar os campos:

javascript
db.cursos
  .find(
    { ativo: true },
    { titulo: 1, nota: 1 }
  )
  .sort({ nota: -1, _id: 1 })
  .limit(3)

1 inclui o campo; _id continua incluído por padrão e pode ser excluído explicitamente. A ordenação usa -1 para decrescente e 1 para crescente. O _id como segundo critério torna a ordem estável quando duas notas empatam. Sem desempate, itens iguais podem trocar de posição entre páginas.

Em geral, não misture inclusão e exclusão na mesma projeção, com a exceção de _id. Uma projeção reduz dados transmitidos e deixa o contrato mais claro, mas não serve para esconder segredos de quem já tem acesso à coleção. Permissões e separação de dados continuam necessárias no servidor.

Paginação precisa de uma ordem estável

Uma página simples pode usar skip e limit:

javascript
const pagina = 2
const porPagina = 10

db.cursos
  .find({ ativo: true })
  .sort({ _id: 1 })
  .skip((pagina - 1) * porPagina)
  .limit(porPagina)

Esse deslocamento é fácil de entender, mas páginas distantes obrigam o servidor a percorrer muitos resultados anteriores e inserções podem deslocar itens. Em listas grandes, paginação por cursor usando o último valor ordenado costuma ser mais estável. Essa é uma decisão posterior, guiada pelo volume e pela consulta.

Também limite entradas vindas da URL. Uma API não deve aceitar limit negativo, texto no lugar de número ou dez milhões de resultados por página. Converta, valide e imponha um teto antes de montar a consulta. A camada do banco recebe um valor já compreendido, não uma string crua do usuário.

No laboratório, execute o filtro combinado e espere três documentos. Ele é um simulador didático no navegador: não usa BSON, índice, projeção, ordenação nem paginação. Experimente $or e veja o erro controlado; $or existe no MongoDB real, mas não faz parte deste simulador. Os únicos operadores aceitos aqui são igualdade, $gte, $gt, $lte, $lt, $ne e $in.

Sua missão é filtrar cargas entre 5 e 10 horas no papel, listar os títulos esperados e depois confirmar com os dados. Em seguida, escreva a versão real com projeção, ordenação por nota e limite. Na próxima aula, vamos resumir grupos com agregação e planejar índices para consultas recorrentes.

Laboratório ao vivo

Filtre cursos por carga e nível

Execute o filtro combinado e altere os limites. O simulador aceita somente igualdade, $gte, $gt, $lte, $lt, $ne e $in sobre o JSON fornecido.

Pronto para testar

Resultado

Pare e pense

O que dois campos no mesmo documento de filtro representam por padrão?

Escolha uma resposta
Missão da aula

Faça sem copiar

Crie um filtro para cursos com 5 a 10 horas, escreva uma ordenação por nota e limite a três itens. Preveja a sequência antes de consultar.

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: Agregação e índices no MongoDB sem adivinhação →