SQL到MongoDB的映射图表 在本页面

除了下面的图表之外,您可能需要考虑有关MongoDB的常见问题的常见问题部分。

术语和概念

下表介绍了各种SQL术语和概念以及相应的MongoDB术语和概念。

SQL术语/概念 MongoDB术语/概念
database database
table collection
row document or BSON document
column field
index index
table joins $lookup, 嵌入文档
primary key
(指定任何唯一的列或列组合作为主键。)
primary key
(在MongoDB中,主键自动设置为_id字段。)
aggregation (e.g. group by) aggregation pipeline
See the SQL to Aggregation Mapping Chart.
SELECT INTO NEW_TABLE $out
See the SQL to Aggregation Mapping Chart.
MERGE INTO TABLE $merge (Available starting in MongoDB 4.2)
See the SQL to Aggregation Mapping Chart.
Transactions transactions
在许多情况下,非规范化数据模型(嵌入式文档和数组)
将继续是您数据和用例的最佳选择,而不是多文档事务。
也就是说,在许多情况下,对数据进行适当的建模将最
大程度地减少对多文档交易的需求。

可执行文件

下表展示了一些数据库可执行文件和相应的MongoDB可执行文件。这个表格并不是详尽无遗的。

MongoDB MySQL Oracle Informix DB2
Database Server mongod mysqld oracle IDS DB2 Server
Database Client mongo 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 Schema语句 MongoDB Schema语句
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()

有关使用的方法和运算符的更多信息,请参见:

db.collection.insertOne() db.collection.updateMany() $set
db.collection.insertMany() db.collection.createIndex() $unset
db.createCollection() db.collection.drop()

另看:

下表显示了与将记录插入表和相应的MongoDB语句有关的各种SQL语句。

SQL INSERT语句 MongoDB insertOne() Statements
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( { userid: /bc/ } )
_or

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

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()
or
db.people.find().count()
SELECT COUNT(user_id)
FROM people
db.people.count( { userid: { $exists: true } } )
_or

db.people.find( { user_id: { $exists: true } } ).count()
SELECT COUNT()
FROM people
*WHERE
age > 30
db.people.count( { age: { $gt: 30 } } )
or
db.people.find( { age: { $gt: 30 } } ).count()
SELECT DISTINCT(status)
FROM people
db.people.aggregate( [ { $group : { _id : "$status" } } ] )
or, for distinct value sets that do not exceed the BSON size limit
db.people.distinct( "status" )
SELECT
FROM people
*LIMIT
1
db.people.findOne()
or
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()

有关使用的方法和运算符的更多信息,请参见:

.db.collection.find() .$ne
.db.collection.distinct() .$and
.db.collection.findOne() .$or
.limit() .$gt
.skip() .$lt
.explain() .$exists
.sort() .$lte
.count() .$regex

另看:

下表显示了与更新表中的现有记录和相应的MongoDB语句有关的各种SQL语句。

SQL Update Statements MongoDB updateMany() Statements
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 } }
)

有关示例中使用的方法和运算符的更多信息,请参见:

另看:

下表显示了与从表中删除记录和相应的MongoDB语句有关的各种SQL语句。

SQL Delete Statements MongoDB deleteMany() Statements
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
  • 应用程序现代化记分卡

译者:杨帅

校对:杨帅

参见

原文 - SQL to MongoDB Mapping Chart

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:26

results matching ""

    No results matching ""