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
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:
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:
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:
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:
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.
Resultado
Pare e pense
O que dois campos no mesmo documento de filtro representam por padrão?
Condições em campos diferentes são combinadas como AND implícito. Para alternativas, o MongoDB real oferece operadores lógicos explícitos.
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 →