Pular para o conteúdo
Documentação

SQL JOIN → MongoDB $lookup

O workspace Tools → SQL Query traduz SQL INNER JOIN e LEFT JOIN para pipelines MongoDB $lookup + $unwind automaticamente. Sem rewrite manual.

O que ele faz

Quando você escreve SQL com uma ou mais cláusulas JOIN, NoSqlStudio emite o pipeline de aggregation equivalente: cada JOIN vira um stage $lookup seguido de $unwind. Referências de coluna qualificadas (u.name, o.userId) são reescritas corretamente — campos da collection principal dropam o qualifier; campos das collections joinadas preservam o alias como path de sub-documento.

Como abrir

  1. Pressione Ctrl+Alt+Q (ou abra Tools → SQL Query do menu).
  2. Digite ou cole seu SQL no painel da esquerda.
  3. Clique em "Convert" — a aggregation MongoDB aparece à direita, pronta para copiar no mongosh.

INNER JOIN — match obrigatório

INNER JOIN dropa documentos que não têm match do lado joinado (preserveNullAndEmptyArrays: false). Exemplo:

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

Traduz para:

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 mantém documentos sem match do lado joinado (preserveNullAndEmptyArrays: true). Útil quando você quer todos os usuários mais suas orders se tiverem alguma:

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 encadeados

Você pode encadear múltiplos JOINs. O localField do N-ésimo lookup pode referenciar campos de qualquer 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

Limitações (v1)

  • RIGHT JOIN / FULL OUTER JOIN / CROSS JOIN: não suportados. $lookup não tem equivalente nativo. Inverta os lados (transforme RIGHT JOIN num LEFT JOIN da query invertida) ou escreva o pipeline à mão no mongosh.
  • ON multi-condição (AND/OR): não suportado. Use a forma mais simples com uma única condição de equi-join, ou reescreva usando a forma de $lookup pipeline no mongosh.
  • USING (col): não suportado. Use ON a.col = b.col explícito.
  • Erros amigáveis: quando um dos casos acima aparece, o tradutor retorna uma mensagem específica — não o erro críptico de parser que você teria com um tradutor genérico.