文档
SQL JOIN → MongoDB $lookup
Tools → SQL Query workspace 自动将 SQL INNER JOIN 和 LEFT JOIN 转换为 MongoDB $lookup + $unwind pipelines。无需手动重写。
它做什么
当您编写带一个或多个 JOIN 子句的 SQL 时,NoSqlStudio 发出等效的 aggregation pipeline:每个 JOIN 变为 $lookup stage 后跟 $unwind。限定列引用(u.name、o.userId)被正确重写 — 主 collection 的字段去掉限定符;joined collections 的字段将别名保留为子文档路径。
如何打开
- 按 Ctrl+Alt+Q(或从菜单打开 Tools → SQL Query)。
- 在左侧面板中输入或粘贴您的 SQL。
- 点击 "Convert" — MongoDB aggregation 出现在右侧,可复制到 mongosh。
INNER JOIN — 需要匹配
INNER JOIN 丢弃在 joined 侧无匹配的文档(preserveNullAndEmptyArrays: false)。示例:
SELECT u.name, COUNT(o._id) AS orderCount
FROM users u
INNER JOIN orders o ON u._id = o.userId
GROUP BY u.name转换为:
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 — 可选匹配
LEFT JOIN 保留在 joined 侧无匹配的文档(preserveNullAndEmptyArrays: true)。当您想要所有用户加上他们的 orders(如果有)时很有用:
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
您可以链接多个 JOINs。第 N 个 lookup 的 localField 可以引用任何先前 joined 别名的字段:
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限制(v1)
- RIGHT JOIN / FULL OUTER JOIN / CROSS JOIN:不支持。$lookup 没有原生等效项。反转两侧(将 RIGHT JOIN 转换为反向查询的 LEFT JOIN),或在 mongosh 中手动编写 pipeline。
- 多条件 ON(AND/OR):不支持。使用带单一 equi-join 条件的更简单形式,或在 mongosh 中使用 $lookup pipeline 形式重写。
- USING (col):不支持。使用显式 ON a.col = b.col。
- 友好的错误:当出现上述之一时,转换器返回特定消息 — 而不是您从通用转换器得到的难以理解的 parser 错误。