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
- Presione Ctrl+Alt+Q (o abra Tools → SQL Query del menú).
- Escriba o pegue su SQL en el panel de la izquierda.
- 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.nameSe 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._idLimitaciones (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.