Skip to main content

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étodoPara que serveExemplo
.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 })
ValorOrdem
1crescente
-1decrescente

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:

ModoO 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 fazerUse
Ordenar.sort()
Limitar resultado.limit()
Paginar.skip() + .limit()
Escolher camposprojeçã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()