¿Por qué usar un generador de queries MongoDB?
MongoDB tiene una sintaxis rica pero no siempre intuitiva. Recordar la estructura exacta de $lookup, $facet o $geoNear consume tiempo. Este generador te da ejemplos reales que podés adaptar: cambiás nombres de colección, ajustás campos y listo. Es especialmente útil cuando migrás de SQL y todavía pensás en JOINs en lugar de pipelines, o cuando necesitás prototipar rápido sin consultar docs. Los ejemplos cubren desde CRUD básico hasta agregaciones multi-stage y operaciones geoespaciales.
Errores comunes al escribir queries MongoDB
Olvidar ObjectId(): Si buscás por _id con un string, no va a matchear; necesitás ObjectId('...'). Confundir $set con $push: $set reemplaza un campo; $push agrega a un array. Usar $size con rangos: $size solo acepta valores exactos; para rangos usá $expr con $gte. No indexar campos filtrados: Queries en campos sin índice son lentas en colecciones grandes; creá índices con createIndex. Pipelines sin $match temprano: Poné $match lo antes posible para reducir documentos procesados.
Operadores que todo developer MongoDB debe conocer
$match filtra documentos (equivalente a WHERE). $group agrupa y calcula (SUM, AVG, COUNT). $lookup hace joins entre colecciones. $project selecciona/transforma campos. $unwind descompone arrays en documentos individuales. $sort ordena (1 ascendente, -1 descendente). $limit y $skip paginan resultados. $addFields crea campos calculados sin eliminar existentes. $facet ejecuta múltiples pipelines en paralelo. $geoNear busca por proximidad geográfica. Combiná estos operadores para queries complejas manteniendo legibilidad.
Cuándo usar aggregate en lugar de find
Usá find() para consultas simples: filtrar, ordenar, limitar. Es más rápido y directo cuando no necesitás transformar datos. Pasá a aggregate() cuando necesités: calcular totales/promedios por grupo, hacer joins con $lookup, aplanar arrays con $unwind, crear campos calculados, filtrar después de agrupar ($match post-$group), o ejecutar análisis complejos. Aggregate es más potente pero también más pesado; si solo necesitás { status: 'active' }, find es suficiente. Regla práctica: si necesitás más de un paso de transformación, aggregate es tu herramienta.
Tabla de referencia: operadores MongoDB más usados
Referencia rápida de las etapas de aggregation y los operadores de query que más vas a escribir, para qué sirven y un ejemplo listo para copiar.
| Operador | Para qué sirve | Ejemplo |
|---|---|---|
$match | Etapa: filtra documentos (equivale a WHERE) | { $match: { status: 'active' } } |
$group | Etapa: agrupa y acumula (sum, avg, count) | { $group: { _id: '$city', total: { $sum: 1 } } } |
$project | Etapa: selecciona o transforma campos de salida | { $project: { name: 1, _id: 0 } } |
$lookup | Etapa: hace un join con otra colección | { $lookup: { from: 'orders', localField: '_id', foreignField: 'userId', as: 'orders' } } |
$sort | Etapa: ordena (1 ascendente, -1 descendente) | { $sort: { createdAt: -1 } } |
$limit | Etapa: limita la cantidad de documentos | { $limit: 10 } |
$unwind | Etapa: descompone un array en documentos individuales | { $unwind: '$tags' } |
$eq | Query: igual a un valor | { age: { $eq: 30 } } |
$gt | Query: mayor que | { price: { $gt: 100 } } |
$in | Query: coincide con alguno de una lista | { status: { $in: ['active', 'trial'] } } |
$regex | Query: coincide con una expresión regular | { name: { $regex: '^A', $options: 'i' } } |