Ir al contenido
Documentación

SQL JOIN → MongoDB $lookup

El workspace Tools → SQL Query traduce SQL INNER JOIN y LEFT JOIN a pipelines MongoDB $lookup + $unwind automáticamente. Sin rewrite manual.

Qué hace

Cuando escribe SQL con una o más cláusulas JOIN, NoSqlStudio emite el pipeline de aggregation equivalente: cada JOIN se vuelve un stage $lookup seguido de $unwind. Referencias de columna calificadas (u.name, o.userId) son reescritas correctamente — campos de la collection principal dropan el qualifier; campos de las collections joinadas preservan el alias como path de sub-documento.

Cómo abrirlo

  1. Presione Ctrl+Alt+Q (o abra Tools → SQL Query del menú).
  2. Escriba o pegue su SQL en el panel de la izquierda.
  3. Haga clic en "Convert" — la aggregation MongoDB aparece a la derecha, lista para copiar al mongosh.

INNER JOIN — match obligatorio

INNER JOIN dropa documentos que no tienen match del lado joinado (preserveNullAndEmptyArrays: false). Ejemplo:

SELECT u.name, COUNT(o._id) AS orderCount
FROM users u
INNER JOIN orders o ON u._id = o.userId
GROUP BY u.name

Se traduce a:

db.users.aggregate([
  { $lookup: { from: 'orders', localField: '_id', foreignField: 'userId', as: 'o' } },
  { $unwind: { path: '$o', preserveNullAndEmptyArrays: false } },
  { $group: { _id: '$name', orderCount: { $sum: { $cond: [{ $ne: ['$o._id', null] }, 1, 0] } } } },
  { $project: { _id: 0, name: '$_id', orderCount: 1 } }
])

LEFT JOIN — match opcional

LEFT JOIN mantiene documentos sin match del lado joinado (preserveNullAndEmptyArrays: true). Útil cuando quiere todos los usuarios más sus orders si tienen alguna:

SELECT u.name, u.email, o.total, o.createdAt
FROM users u
LEFT JOIN orders o ON u._id = o.userId
WHERE u.tier = 'enterprise'

JOINs encadenados

Puede encadenar múltiples JOINs. El localField del N-ésimo lookup puede referenciar campos de cualquier alias previamente joinado:

SELECT u.name, o.total, p.title
FROM users u
INNER JOIN orders o ON u._id = o.userId
INNER JOIN products p ON o.productId = p._id

Limitaciones (v1)

  • RIGHT JOIN / FULL OUTER JOIN / CROSS JOIN: no soportados. $lookup no tiene equivalente nativo. Invierta los lados (transforme RIGHT JOIN en un LEFT JOIN de la query invertida) o escriba el pipeline a mano en el mongosh.
  • ON multi-condición (AND/OR): no soportado. Use la forma más simple con una única condición de equi-join, o reescriba usando la forma de $lookup pipeline en el mongosh.
  • USING (col): no soportado. Use ON a.col = b.col explícito.
  • Errores amigables: cuando uno de los casos arriba aparece, el traductor retorna un mensaje específico — no el error críptico de parser que tendría con un traductor genérico.