跳转到内容
文档

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 的字段将别名保留为子文档路径。

如何打开

  1. 按 Ctrl+Alt+Q(或从菜单打开 Tools → SQL Query)。
  2. 在左侧面板中输入或粘贴您的 SQL。
  3. 点击 "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 错误。