SQL 查询
MONGODB 查询
// 转换结果将显示在这里……
// 试试示例

这个 SQL 转 MongoDB 转换器是什么?

本工具把标准 SQL 查询翻译成 MongoDB 的等价语法。MongoDB 是一种面向文档的 NoSQL 数据库。工具面向正在从关系型数据库迁移,或者需要同时使用两种数据库的开发者。

在左侧面板输入 SQL 查询,对应的 MongoDB 查询会即时显示在右侧。解析由真正的 SQL 解析器完成,因此复杂的 WHERE 条件和基础聚合都能被正确转换,而不是靠猜测。

转换器基于 SQL 解析库构建,因此可以处理相当广泛的语句:

SELECT

find() — 基础查询

列的选择与 WHERE 条件会转换为 MongoDB 的 find() 调用,包含查询过滤器和投影。

SELECT name, age FROM users WHERE age > 25 db.users.find( { age: { $gt: 25 } }, { name: 1, age: 1, _id: 0 } )
SELECT

sort()、limit()、skip()

ORDER BY 转换为 sort(),LIMIT 转换为 limit(),OFFSET 转换为 skip()。

SELECT * FROM products ORDER BY price DESC LIMIT 10 OFFSET 20 db.products.find({}) .sort({ price: -1 }) .skip(20).limit(10)
AGGREGATE

GROUP BY → aggregate()

GROUP BY 与聚合函数(COUNT、SUM、AVG、MIN、MAX)一起使用时,会转换为 MongoDB 的聚合管道。

SELECT country, COUNT(*) AS total FROM users GROUP BY country db.users.aggregate([ { $group: { _id: { country: "$country" }, total: { $sum: 1 } } } ])
AGGREGATE

HAVING → $group 之后的 $match

HAVING 过滤条件会成为管道中的第二个 $match 阶段,在分组完成之后执行。

SELECT category, AVG(price) AS avg_p FROM products GROUP BY category HAVING AVG(price) > 50 → pipeline with $group then $match
WHERE

LIKE → $regex

使用 %(任意字符)和 _(单个字符)的 SQL LIKE 模式会转换为 MongoDB 的正则表达式。

WHERE name LIKE '%mongo%' { name: { $regex: /.*mongo.*/ } } WHERE code LIKE 'IT_' { code: { $regex: /^IT.$/ } } NOT LIKE { field: { $not: /pattern/ } }
WHERE

IN、IS NULL、AND/OR

完整支持 IN/$in、NOT IN/$nin、IS NULL、IS NOT NULL/$ne、AND/$and 与 OR/$or,包括用括号分组条件。

WHERE status IN ('a','b') { status: { $in: ["a","b"] } } WHERE deleted_at IS NULL { deleted_at: null } WHERE a=1 AND b=2 { $and: [{a:1},{b:2}] }
INSERT

insertOne() / insertMany()

单行 INSERT 转换为 insertOne(),多行 INSERT 转换为 insertMany()。列名会成为文档的字段名。

INSERT INTO users (name, age) VALUES ('Alice', 30) db.users.insertOne({ name: "Alice", age: 30 })
UPDATE

带 $set 的 updateMany()

SET 子句会转换为 MongoDB 的 $set 操作符,WHERE 条件则成为过滤文档。

UPDATE users SET status = 'active' WHERE id = 42 db.users.updateMany( { id: 42 }, { $set: { status: "active" } } )
DELETE

deleteMany()

带 WHERE 条件的 DELETE FROM 会转换为 deleteMany()。请谨慎使用:没有 WHERE 时会删除集合中的全部文档。

DELETE FROM sessions WHERE expires < '2024-01-01' db.sessions.deleteMany({ expires: { $lt: "2024-01-01" } })

SQL → MongoDB 操作符对照表

SQL 操作符 MongoDB 操作符 说明
=$eq (or implicit)精确匹配
!= / <>$ne不等于
>$gt大于
>=$gte大于或等于
<$lt小于
<=$lte小于或等于
IN (...)$in值在列表中
NOT IN (...)$nin值不在列表中
LIKE '%x%'$regex: /.*x.*/% 变为 .*,_ 变为 .
NOT LIKE$not: /pattern/取反的正则表达式
IS NULLfield: null同时匹配不存在的字段
IS NOT NULL$ne: null字段存在且不为 null
AND$and所有条件都必须满足
OR$or满足任意一个条件即可
COUNT(*)$sum: 1位于 $group 阶段内
SUM(f)$sum: "$f"位于 $group 阶段内
AVG(f)$avg: "$f"位于 $group 阶段内
MIN(f)$min: "$f"位于 $group 阶段内
MAX(f)$max: "$f"位于 $group 阶段内
ORDER BY ASCsort({ f: 1 })升序
ORDER BY DESCsort({ f: -1 })降序
LIMIT nlimit(n)
OFFSET nskip(n)

为什么要把 SQL 转换成 MongoDB?

数据库迁移

正在从 MySQL、PostgreSQL、SQL Server 或 SQLite 迁移到 MongoDB?快速翻译已有的查询逻辑,降低迁移过程中出错的风险。

学习 MongoDB

如果你已经熟悉 SQL,把每个概念与其对应写法并排对照,是掌握 MongoDB 查询语言及其背后文档模型最快的途径。

日常开发

即使是经验丰富的 MongoDB 开发者,也常常先用 SQL 思考。把本工具当作速查表,把脑中的想法翻译成正确的语法。

团队协作

把转换后的查询分享给来自关系型数据库背景的同事。一份共同的参考能减少两种数据库文化之间的摩擦。

常见问题

如何把 SQL 查询转换为 MongoDB?

把 SQL 语句粘贴到输入面板并点击转换。工具会解析这段 SQL,返回等价的 MongoDB shell 命令:SELECT 变成 find(),WHERE 条件变成查询过滤器,ORDER BY 变成 sort(),LIMIT 和 OFFSET 变成 limit() 与 skip()。无需注册,也无需安装任何软件。

MongoDB 中与 SQL LIKE 等价的写法是什么?

MongoDB 没有 LIKE 关键字,模式匹配通过 $regex 实现。SQL 的通配符 % 对应 .*,通配符 _ 对应单个点号。因此 WHERE name LIKE '%mongo%' 会转换为 { name: { $regex: /.*mongo.*/ } },而 NOT LIKE 会被包在 $not 中。

MongoDB 中与 GROUP BY 等价的写法是什么?

GROUP BY 对应带 $group 阶段的聚合管道。分组的列会成为该阶段的 _id,聚合函数则成为累加器:COUNT(*) 变成 { $sum: 1 },SUM(字段) 变成 { $sum: "$字段" },AVG、MIN 和 MAX 分别对应 $avg、$min 和 $max。HAVING 子句会成为放在 $group 之后的第二个 $match 阶段。

这个转换器支持 SQL 的 JOIN 吗?

不能自动处理。MongoDB 中的 JOIN 需要 $lookup 阶段,同时还要决定关联数据应当内嵌还是引用,这取决于你的模式设计,无法仅凭 SQL 推断。请在此转换单表查询,然后自行加上 $lookup 阶段。

可以用这个工具把 MySQL 或 SQL Server 的数据迁移到 MongoDB 吗?

不可以。本转换器翻译的是查询语法,而不是数据本身。要迁移数据行,需要使用迁移工具,例如 MongoDB Relational Migrator,它是免费的,支持 Oracle、SQL Server、MySQL 和 PostgreSQL。可以同时使用本转换器来翻译应用代码中已有的查询。

这个 SQL 转 MongoDB 转换器是免费的吗?

是的。本工具完全免费,在浏览器中运行,不需要账号,也不会保存你的任何查询。提供英语、意大利语、俄语、中文、法语和西班牙语六种界面语言。

在规划整套迁移,而不只是一条查询?

转换查询只是最后一步。这些指南讲的是决定迁移成败的部分:如何把关系型结构重新设计成文档模型。