Gerador de MongoDB find()
Constrói uma query find() do MongoDB a partir de filtros (campo: valor), projeção e ordenação. Usa operadores $eq, $gt, $in.
MongoDB find em profundidade
db.collection.find(filter, projection) é a operação de leitura primária no MongoDB. O primeiro argumento é um documento de filtro comparado contra cada registro da coleção; o segundo é uma projeção opcional escolhendo quais campos retornam. A chamada devolve um cursor — um fluxo preguiçoso materializado pelo driver com .toArray(), .forEach(), .map() ou .next(). O MongoDB armazena documentos em BSON, um superset binário do JSON com tipos extras como ObjectId, Date, Decimal128 e Binary.
Operadores de filtro
- Comparação:
$eq,$ne,$gt,$gte,$lt,$lte,$in [array],$nin. - Elemento:
$exists: true/false,$type: 'string'. - Avaliação:
$regex /padrao/i,$mod: [div, resto],$expr,$jsonSchema. - Lógicos:
$and,$or,$nor,$not. - Array:
$all,$elemMatch,$size. - Geoespacial:
$near,$geoWithin,$geoIntersects(precisam de índice 2dsphere).
Projeção e modificadores de cursor
A projeção é inclusiva ({ name: 1, email: 1 }) ou exclusiva ({ password: 0 }); os dois modos não podem ser misturados, exceto para _id, que é incluído por padrão e precisa de { _id: 0 } para sumir. Modificadores encadeados refinam o resultado: .sort({ createdAt: -1 }), .limit(n), .skip(n), .hint({ campo: 1 }) para forçar um índice e .countDocuments(filter) para contagem precisa (o antigo .count() está depreciado). .explain('executionStats') mostra o plano vencedor, totalDocsExamined e executionTimeMillis — o comando de debug mais útil do MongoDB.
Índices e a regra ESR
Um índice B-tree é criado com db.collection.createIndex({ campo: 1 }). Índices compostos seguem a regra ESR: Equality (igualdade) primeiro, depois Sort (ordenação), depois Range (faixa). Variantes incluem text (full-text), 2dsphere (geoespacial), hashed (sharding), partial (filtrado) e TTL (auto-expiração). Quando uma query não consegue usar índice, dispara um COLLSCAN — varredura completa da coleção — tolerável em dev, catastrófico em produção.
Quando migrar para o pipeline de agregação
Quando você precisa de agrupamento, joins, campos derivados ou transformações em múltiplas etapas, abandone o find e vá para o pipeline de agregação: $match, $project, $group, $sort, $lookup (left join), $unwind (explode arrays), $bucket (histogramas) e $facet (sub-pipelines paralelos). O primeiro estágio $match do pipeline se comporta como filtro de find e recebe a mesma otimização de índice.
Perguntas frequentes
$or usa índice? Sim, mas só se cada braço do $or tiver um índice no seu campo — caso contrário o MongoDB cai em varredura completa. O explain mostra o estágio OR e qual índice cada filho usa.
Por que paginação com .skip(N).limit(20) fica lenta em coleções grandes? Porque o skip ainda percorre todos os documentos anteriores. Prefira paginação por intervalo: guarde o último _id ou createdAt e consulte { _id: { $gt: ultimoId } }; cai direto no índice e roda em tempo constante.
Como o MongoDB difere de um banco SQL? Cada linha vira um documento JSON-like autossuficiente; arrays e objetos aninhados substituem JOINs; o schema é flexível (sem ALTER TABLE); e o sharding horizontal é nativo via shard keys e config servers.
O Mongoose é obrigatório? Não. O Mongoose é um ODM que adiciona schema, hooks e validadores em cima do driver oficial mongodb. O driver puro é mais rápido e leve; o Mongoose ajuda quando se precisa de validação declarativa e formatos consistentes.
Ferramentas Relacionadas
Gerador de find
Construa comandos find por nome, tipo, tamanho, idade e -exec/-delete. Útil para varreduras em scripts shell.
Gerador de Elasticsearch Query DSL
Constrói uma query Elasticsearch DSL (match, term, range, bool) em JSON, pronta para colar no _search.
Gerador de MongoDB aggregate()
Constrói pipelines aggregate() do MongoDB com $match, $group, $sort, $limit em sequência. Pronto para colar.