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)

参见 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 命令 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 INSERT 语句 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/ } )

-or-

db.people.find( { user_id: { $regex: /bc/ } } )
SELECT *
FROM people
WHERE user_id like "bc%"
db.people.find( { user_id: /^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( { user_id: { $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()

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

更新记录

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

SQL Update 语句 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 Delete 语句 MongoDB deleteMany() 语句
DELETE FROM people
WHERE status = "D"
db.people.deleteMany( { status: "D" } )
DELETE FROM people
db.people.deleteMany({})

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


原文:https://docs.mongodb.com/manual/reference/sql-comparison/