Docs 菜单

Docs 主页开发应用程序MongoDB Manual

SQL 到 MongoDB 的映射表

在此页面上

  • 术语和概念
  • 可执行程序
  • 举例
  • 深入阅读

除下面的图表外,您可能还需要查看常见问题部分,了解有关 MongoDB 的一系列常见问题。

下表列出各种 SQL 术语和概念以及相应的 MongoDB 术语和概念。

SQL 术语/概念
MongoDB 术语/概念
数据库
数据表(table)
文档BSON 文档
索引(index)
表连接

主键

指定任何唯一列或列组合作为主键。

主键

在 MongoDB 中,主键会自动设置为 _id 字段。

聚合(例如分组依据)

聚合管道

请参阅 SQL 聚合映射图表

SELECT INTO NEW_TABLE
MERGE INTO TABLE

$merge (从 MongoDB 4.2 开始可用)

请参阅 SQL 聚合映射图表

UNION ALL
事务

事务

提示

在许多场景中,非规范化数据模型(嵌入式文档和数组),而不是多文档事务,将继续是数据和使用案例的最佳选择。换言之,对于许多场景,适当地建模数据将最大限度地减少对多文档事务的需求。

下表显示了一些数据库可执行文件和相应的 MongoDB 可执行文件。此表并非详尽。

MongoDB
MySQL
Oracle
Informix
Db2
数据库服务器
mysqld
oracle
IDS
DB2 Server
数据库客户端
mongosh
mysql
sqlplus
DB-Access
DB2 Client

下表列出了各种 SQL 语句和相应的 MongoDB 语句。该表中的示例假定以下条件:

  • 这些 SQL 示例假设有一个名为 people 的表。

  • MongoDB 示例假设一个名为 people 的集合包含以下原型的文档:

    {
    _id: ObjectId("509a8fb2f3f4948bd2f983a0"),
    user_id: "abc123",
    age: 55,
    status: 'A'
    }

下表列出了与表级动作相关的各种 SQL 语句以及对应的 MongoDB 语句。

SQL 模式语句
MongoDB 模式语句
CREATE TABLE people (
id MEDIUMINT NOT NULL
AUTO_INCREMENT,
user_id Varchar(30),
age Number,
status char(1),
PRIMARY KEY (id)
)

在第一个 insertOne()insertMany() 操作上隐式创建。如果未指定 _id 字段,则会自动添加主键 _id

db.people.insertOne( {
user_id: "abc123",
age: 55,
status: "A"
} )

不过,您也可以显式创建集合:

db.createCollection("people")
ALTER TABLE people
ADD join_date DATETIME

集合并不描述或强制执行其文档的结构;也就是说,集合层面上不会有结构变化。

不过,在文档级别,updateMany() 操作可以使用 $set 操作符将字段添加到现有文档中。

db.people.updateMany(
{ },
{ $set: { join_date: new Date() } }
)
ALTER TABLE people
DROP COLUMN join_date

集合并不描述或强制执行其文档的结构;也就是说,集合层面上不会有结构变化。

不过,在文档级别,updateMany() 操作可以使用 $unset 操作符从文档中删除字段。

db.people.updateMany(
{ },
{ $unset: { "join_date": "" } }
)
CREATE INDEX idx_user_id_asc
ON people(user_id)
db.people.createIndex( { user_id: 1 } )
CREATE INDEX
idx_user_id_asc_age_desc
ON people(user_id, age DESC)
db.people.createIndex( { user_id: 1, age: -1 } )
DROP TABLE people
db.people.drop()

有关所使用的方法和操作符的更多信息,请参阅:

提示

另请参阅:

下表列出与向表中插入记录相关的各种 SQL 语句以及相应的 MongoDB 语句。

SQL 插入语句
MongoDB insertOne () 语句
INSERT INTO people(user_id,
age,
status)
VALUES ("bcd001",
45,
"A")
db.people.insertOne(
{ user_id: "bcd001", age: 45, status: "A" }
)

有关更多信息,请参阅 db.collection.insertOne()

下表列出与从表中读取记录相关的各种 SQL 语句以及相应的 MongoDB 语句。

注意

find() 方法始终在返回的文档中包含 _id 字段,除非通过投影特别排除。 以下某些 SQL 查询可能包含 _id 字段来反映这一点,即使该字段未包含在相应的 find() 查询中。

SQL SELECT 语句
MongoDB find () 语句
SELECT *
FROM people
db.people.find()
SELECT id,
user_id,
status
FROM people
db.people.find(
{ },
{ user_id: 1, status: 1 }
)
SELECT user_id, status
FROM people
db.people.find(
{ },
{ user_id: 1, status: 1, _id: 0 }
)
SELECT *
FROM people
WHERE status = "A"
db.people.find(
{ status: "A" }
)
SELECT user_id, status
FROM people
WHERE status = "A"
db.people.find(
{ status: "A" },
{ user_id: 1, status: 1, _id: 0 }
)
SELECT *
FROM people
WHERE status != "A"
db.people.find(
{ status: { $ne: "A" } }
)
SELECT *
FROM people
WHERE status = "A"
AND age = 50
db.people.find(
{ status: "A",
age: 50 }
)
SELECT *
FROM people
WHERE status = "A"
OR age = 50
db.people.find(
{ $or: [ { status: "A" } , { age: 50 } ] }
)
SELECT *
FROM people
WHERE age > 25
db.people.find(
{ age: { $gt: 25 } }
)
SELECT *
FROM people
WHERE age < 25
db.people.find(
{ age: { $lt: 25 } }
)
SELECT *
FROM people
WHERE age > 25
AND age <= 50
db.people.find(
{ age: { $gt: 25, $lte: 50 } }
)
SELECT *
FROM people
WHERE user_id like "%bc%"
db.people.find( { user_id: /bc/ } )

-或-

db.people.find( { user_id: { $regex: /bc/ } } )
SELECT *
FROM people
WHERE user_id like "bc%"
db.people.find( { user_id: /^bc/ } )

-或-

db.people.find( { user_id: { $regex: /^bc/ } } )
SELECT *
FROM people
WHERE status = "A"
ORDER BY user_id ASC
db.people.find( { status: "A" } ).sort( { user_id: 1 } )
SELECT *
FROM people
WHERE status = "A"
ORDER BY user_id DESC
db.people.find( { status: "A" } ).sort( { user_id: -1 } )
SELECT COUNT(*)
FROM people
db.people.count()

db.people.find().count()
SELECT COUNT(user_id)
FROM people
db.people.count( { user_id: { $exists: true } } )

db.people.find( { user_id: { $exists: true } } ).count()
SELECT COUNT(*)
FROM people
WHERE age > 30
db.people.count( { age: { $gt: 30 } } )

db.people.find( { age: { $gt: 30 } } ).count()
SELECT DISTINCT(status)
FROM people
db.people.aggregate( [ { $group : { _id : "$status" } } ] )

或者,对于不超过 BSON 大小限制的非重复值集

db.people.distinct( "status" )
SELECT *
FROM people
LIMIT 1
db.people.findOne()

db.people.find().limit(1)
SELECT *
FROM people
LIMIT 5
SKIP 10
db.people.find().limit(5).skip(10)
EXPLAIN SELECT *
FROM people
WHERE status = "A"
db.people.find( { status: "A" } ).explain()

有关所使用的方法和操作符的更多信息,请参阅

下表列出与更新表中现有记录相关的各种 SQL 语句以及相应的 MongoDB 语句。

SQL 更新语句
MongoDB updateMany() 语句
UPDATE people
SET status = "C"
WHERE age > 25
db.people.updateMany(
{ age: { $gt: 25 } },
{ $set: { status: "C" } }
)
UPDATE people
SET age = age + 3
WHERE status = "A"
db.people.updateMany(
{ status: "A" } ,
{ $inc: { age: 3 } }
)

有关示例中使用的方法和操作符的更多信息,请参阅:

下表列出与从表中删除记录相关的各种 SQL 语句以及相应的 MongoDB 语句。

SQL 删除语句
MongoDB deleteMany () 语句
DELETE FROM people
WHERE status = "D"
db.people.deleteMany( { status: "D" } )
DELETE FROM people
db.people.deleteMany({})

有关更多信息,请参阅 db.collection.deleteMany()

如果您正在考虑将 SQL 应用程序迁移到 MongoDB,请下载MongoDB 应用程序现代化指南

下载内容包括以下资源:

  • 介绍使用 MongoDB 进行数据建模的方法

  • 白皮书介绍了从 RDBMS 数据模型迁移到 MongoDB 的最佳实践和注意事项

  • 引用 MongoDB 模式及其 RDBMS 等效模式

  • 应用程序现代化记分卡

← 可重试读取