Métodos após o find | MongoDB | Banco de Dados
- Métodos após o find | MongoDB | Banco de Dados
No MongoDB, o find() retorna um cursor. Por isso você consegue encadear métodos depois dele, como sort(), limit() e skip(). O próprio material mostra esse padrão de method chaining, onde skip, limit e sort são chamados depois do find, mas enviados como parte da query para o servidor.
Métodos comuns após find()
| Método | Para que serve | Exemplo |
|---|---|---|
.sort() | Ordena os resultados | .sort({ name: 1 }) |
.limit() | Limita a quantidade de documentos | .limit(10) |
.skip() | Pula uma quantidade de documentos | .skip(20) |
.projection() | Define campos retornados | .projection({ name: 1 }) |
.hint() | Força o uso de um índice | .hint({ email: 1 }) |
.explain() | Mostra o plano de execução | .explain("executionStats") |
.collation() | Define regra de comparação de strings | .collation({ locale: "pt", strength: 2 }) |
.batchSize() | Define tamanho dos lotes retornados | .batchSize(100) |
.maxTimeMS() | Define tempo máximo da query | .maxTimeMS(2000) |
.comment() | Adiciona comentário para logs/profiler | .comment("busca clientes ativos") |
.toArray() | Converte o cursor em array | .toArray() |
.forEach() | Itera sobre os documentos | .forEach(doc => print(doc.name)) |
.hasNext() | Verifica se existe próximo documento | .hasNext() |
.next() | Retorna o próximo documento | .next() |
.count() | Conta resultados do cursor, legado/depreciado | .count() |
.itcount() | Itera e conta os documentos no shell | .itcount() |
.pretty() | Formata a saída no shell legado | .pretty() |
Exemplos principais
sort()
Ordena os documentos.
db.users.find({ active: true }).sort({ name: 1 })
| Valor | Ordem |
|---|---|
1 | crescente |
-1 | decrescente |
Exemplo:
db.products.find().sort({ price: -1 })
Retorna produtos do mais caro para o mais barato.
limit()
Limita a quantidade de documentos retornados.
db.products.find().limit(10)
Retorna no máximo 10 documentos.
skip()
Pula uma quantidade de documentos.
db.products.find().skip(20).limit(10)
Útil para paginação:
página 1: skip(0).limit(10)
página 2: skip(10).limit(10)
página 3: skip(20).limit(10)
Mas cuidado: skip() com valores muito altos pode ficar caro, porque o MongoDB precisa passar pelos documentos ignorados. O material alerta que skip grande, por exemplo acima de 10.000, tende a ser ineficiente.
sort() + skip() + limit()
Exemplo clássico de paginação:
const page = 2
const pageSize = 10
db.products
.find({ category: "audio" })
.sort({ price: -1 })
.skip((page - 1) * pageSize)
.limit(pageSize)
O material mostra exatamente esse tipo de encadeamento com find().skip().limit().sort() e observa que, no shell JavaScript, a ordem entre skip, limit e sort não muda o resultado lógico da query.
Projeção de campos
Você pode passar a projeção direto no find():
db.users.find(
{ active: true },
{ name: 1, email: 1, _id: 0 }
)
Retorna apenas:
{
name: "...",
email: "..."
}
Também existe o estilo com .projection() em alguns drivers:
db.users.find({ active: true }).projection({ name: 1, email: 1 })
A ideia da projeção é reduzir os campos retornados e diminuir transferência de dados.
hint()
Força o uso de um índice.
db.users.find({ email: "a@teste.com" }).hint({ email: 1 })
Ou pelo nome do índice:
db.users.find({ email: "a@teste.com" }).hint("email_1")
Uso comum:
testar performance
validar se um índice ajuda
forçar um índice específico
investigar plano de execução
O material descreve hint() como forma de forçar o uso de um índice.
explain()
Mostra como o MongoDB executou ou planeja executar a query.
db.users.find({ email: "a@teste.com" }).explain()
Mais detalhado:
db.users.find({ email: "a@teste.com" }).explain("executionStats")
Modos comuns:
| Modo | O que mostra |
|---|---|
"queryPlanner" | Plano escolhido pelo otimizador |
"executionStats" | Estatísticas reais de execução |
"allPlansExecution" | Planos avaliados pelo otimizador |
Exemplo:
db.orders
.find({ status: "paid" })
.hint({ status: 1 })
.explain("executionStats")
O material mostra explain() sendo usado para visualizar planos de query e também hint() para forçar um índice específico.
collation()
Define regras de comparação de string, por exemplo, busca sem diferenciar maiúsculas/minúsculas.
db.users
.find({ name: "joao" })
.collation({ locale: "pt", strength: 2 })
Pode bater com:
joao
Joao
JOAO
batchSize()
Define quantos documentos o cursor busca por lote.
db.logs.find({ level: "ERROR" }).batchSize(100)
Isso não limita o total final como limit(). Apenas controla o tamanho dos lotes trafegados entre cliente e servidor.
O material também lista batch_size como opção para alterar o tamanho do lote buscado pelo cursor em operações GETMORE.
maxTimeMS()
Define o tempo máximo permitido para a query.
db.orders
.find({ status: "pending" })
.maxTimeMS(2000)
Se passar de 2 segundos, a operação pode ser interrompida.
comment()
Adiciona um comentário na query.
db.orders
.find({ status: "paid" })
.comment("consulta de pedidos pagos para relatório")
Útil para:
logs
profiler
debug
auditoria
análise de performance
Métodos de iteração do cursor
toArray()
Transforma o cursor em array.
const users = db.users.find({ active: true }).toArray()
Cuidado com collections grandes, porque isso pode carregar muitos documentos na memória.
forEach()
Itera documento por documento.
db.users.find({ active: true }).forEach(user => {
print(user.name)
})
hasNext() e next()
Controlam a iteração manualmente.
const cursor = db.users.find({ active: true })
while (cursor.hasNext()) {
const user = cursor.next()
print(user.name)
}
Um dos materiais explica que find() retorna um cursor e que a consulta só é efetivamente consumida quando você navega por ele, por exemplo com hasNext() ou next().
Exemplo completo
db.products
.find(
{
category: "audio",
price: { $gte: 100 }
},
{
name: 1,
price: 1,
category: 1,
_id: 0
}
)
.sort({ price: -1 })
.skip(0)
.limit(10)
.hint({ category: 1, price: -1 })
.comment("busca produtos audio acima de 100")
Resumo direto
| Quero fazer | Use |
|---|---|
| Ordenar | .sort() |
| Limitar resultado | .limit() |
| Paginar | .skip() + .limit() |
| Escolher campos | projeção no find() ou .projection() |
| Forçar índice | .hint() |
| Ver plano da query | .explain() |
| Comparar texto sem case-sensitive | .collation() |
| Controlar lote do cursor | .batchSize() |
| Limitar tempo da query | .maxTimeMS() |
| Identificar query nos logs | .comment() |
| Converter resultado em array | .toArray() |
| Percorrer documentos | .forEach() |
| Iterar manualmente | .hasNext() + .next() |