从 SQL 到 NoSQL

粘贴一条 SQL SELECT 语句,转换器会将其改写为等效的 MongoDB find() 查询。它将所选列映射为投影,将 WHERE 子句映射为过滤器,将 ORDER BY 映射为 .sort(),将 LIMIT 映射为 .limit()。这是一个针对简单语句的查询改写工具,而非迁移工具:不支持 JOIN、GROUP BY、聚合和子查询。

转换的工作原理

  1. 1

    解析 SELECT

    该工具读取一条形如 `SELECT 列 FROM 表 [WHERE ...] [ORDER BY ...] [LIMIT n]` 的单条语句。

  2. 2

    映射每个子句

    列变为投影 `{ col: 1 }`,`WHERE` 变为过滤器,`ORDER BY` 变为 `.sort()`,`LIMIT` 变为 `.limit()`。

  3. 3

    转换运算符

    比较运算符映射到 Mongo 运算符:`>` 映射为 `$gt`,`<` 为 `$lt`,`>=` 为 `$gte`,`<=` 为 `$lte`,`!=` 为 `$ne`,`=` 为直接匹配。

  4. 4

    复制输出

    生成的 `db.collection.find(...)` 一行可直接粘贴到 mongosh shell 或驱动调用中。

一个实际示例

SQL:

SELECT name, price FROM products WHERE price > 100 ORDER BY price DESC LIMIT 5;

MongoDB 查询:

db.products.find({ price: { $gt: 100 } }, { name: 1, price: 1 }).sort({ price: -1 }).limit(5)

转换器映射的内容

SQL MongoDB find()
SELECT a, b 投影 { a: 1, b: 1 }
SELECT * 所有字段(空投影)
FROM users db.users.find(...)
WHERE a = 5 { a: 5 }
WHERE a > 5 { a: { $gt: 5 } }
WHERE a >= 5 { a: { $gte: 5 } }
WHERE a != 5 { a: { $ne: 5 } }
WHERE a AND b { a: ..., b: ... }
WHERE a OR b { $or: [ ... ] }
ORDER BY a DESC .sort({ a: -1 })
LIMIT 10 .limit(10)

不支持的内容

  • JOIN。 仅读取单个表。合并集合需要 $lookup 或反规范化的数据模型,这是模式决策,而非查询改写。
  • GROUP BY 与聚合。 COUNT、SUM、AVG 和 GROUP BY 需要聚合管道(db.collection.aggregate([...])),本工具不会生成它。
  • 子查询、CTE 和窗口函数。 请重新考虑模型或将工作拆分为多个阶段;它们无法用 find() 表达。
  • IN、LIKE 和 BETWEEN。 WHERE 解析器仅处理比较运算符 =、>、<、>=、<=、!= 和 <>。
  • 混用 AND 和 OR。 一个 WHERE 子句被当作全部 AND 或全部 OR 处理;不要在同一条语句中混用两者。
  • INSERT、UPDATE、DELETE、CREATE TABLE。 仅转换 SELECT。

关于输出

结果始终是一行 db.collection.find(过滤器, 投影),可选地跟随 .sort() 和 .limit()。它面向 MongoDB 的 shell 和驱动。它不会生成 Firestore 或 Elasticsearch 查询,也不会选择索引或优化性能。在依赖它之前,请用你自己的数据测试该查询。

常见问题

不会。输出始终是面向 mongosh shell 或驱动的 MongoDB find() 查询。没有针对其他文档存储的目标选择器。

不能。那些需要 MongoDB 的聚合管道(aggregate([...])),本工具不会生成它。它只生成带有过滤器、投影、排序和限制的 find() 查询。

不支持。仅读取单个 FROM 表。NoSQL 存储更倾向于内嵌或引用,因此 JOIN 通常意味着数据模型的变更,而非查询改写。

不能。仅转换 SELECT 语句。MongoDB 中的集合默认无模式,因此没有可转换的表定义。

相关工具

此工具还提供其他语言版本