¿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.