写在前面
在sql编辑器里面写习惯了sql语法,偶尔写写MongoDB脚本,一时有点转换不过来,在这里记录一下SQL与MongoDB之间的映射关系。
MongoDB介绍
MongoDB是一个基于文档型存储的NoSQL数据库。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档、数组和文档数组。
MongoDB中文网:MongoDB中文网
术语和概念
| SQL 术语/概念 | MongoDB 术语/概念 |
|---|---|
| database | database |
| 数据表(table) | 集合 |
| 行 | 文档或 BSON 文档 |
| 列 | 字段 |
| 索引(index) | 索引(index) |
| 表连接 | $lookup,嵌入式文档 |
| 主键指定任何唯一列或列组合作为主键。 | 主键在 MongoDB 中,主键会自动设置为 _id 字段。 |
| 聚合(例如分组依据) | 聚合管道请参阅 SQL 聚合映射图表。 |
| SELECT INTO NEW_TABLE | $out请参阅 SQL 聚合映射图表。 |
| MERGE INTO TABLE | $merge请参阅 SQL 聚合映射图表。 |
| UNION ALL | $unionWith |
| 事务 | 不支持,推荐使用非规范化数据模型(嵌入式文档和数组)建模数据 |
集合创建和修改
下表列出了与表级动作相关的各种 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 peopleADD join_date DATETIME | 集合并不描述或强制执行其文档的结构;也就是说,集合层面上不会有结构变化。不过,在文档级别,updateMany() 操作可以使用 $set 操作符将字段添加到现有文档中。db.people.updateMany( { }, { $set: { join_date: new Date() } }) |
ALTER TABLE peopleDROP COLUMN join_date | 集合并不描述或强制执行其文档的结构;也就是说,集合层面上不会有结构变化。不过,在文档级别,updateMany() 操作可以使用 $unset 操作符从文档中删除字段。db.people.updateMany( { }, { $unset: { "join_date": "" } }) |
CREATE INDEX idx_user_id_ascON people(user_id) | db.people.createIndex( { user_id: 1 } ) |
CREATE INDEX idx_user_id_asc_age_descON people(user_id, age DESC) | db.people.createIndex( { user_id: 1, age: -1 } ) |
DROP TABLE people | db.people.drop() |
文档操作
insert
| SQL 插入语句 | MongoDB insertOne () 语句 |
|---|---|
INSERT INTO people(user_id, age, status)VALUES ("bcd001", 45, "A") | db.people.insertOne( { user_id: "bcd001", age: 45, status: "A" }) |
查询
注意
find()方法始终在返回的文档中包含_id字段,除非通过投影特别排除。 以下某些 SQL 查询可能包含_id字段来反映这一点,即使该字段未包含在相应的find()查询中。
| SQL SELECT 语句 | MongoDB find () 语句 |
|---|---|
SELECT *FROM people | db.people.find() |
SELECT id, user_id, statusFROM people | db.people.find( { }, { user_id: 1, status: 1 }) |
SELECT user_id, statusFROM people | db.people.find( { }, { user_id: 1, status: 1, _id: 0 }) |
SELECT *FROM peopleWHERE status = "A" | db.people.find( { status: "A" }) |
SELECT user_id, statusFROM peopleWHERE status = "A" | db.people.find( { status: "A" }, { user_id: 1, status: 1, _id: 0 }) |
SELECT *FROM peopleWHERE status != "A" | db.people.find( { status: { $ne: "A" } }) |
SELECT *FROM peopleWHERE status = "A"AND age = 50 | db.people.find( { status: "A", age: 50 }) |
SELECT *FROM peopleWHERE status = "A"OR age = 50 | db.people.find( { $or: [ { status: "A" } , { age: 50 } ] }) |
SELECT *FROM peopleWHERE age > 25 | db.people.find( { age: { $gt: 25 } }) |
SELECT *FROM peopleWHERE age < 25 | db.people.find( { age: { $lt: 25 } }) |
SELECT *FROM peopleWHERE age > 25AND age <= 50 | db.people.find( { age: { $gt: 25, $lte: 50 } }) |
SELECT *FROM peopleWHERE user_id like "%bc%" | db.people.find( { user_id: /bc/ } )-或-db.people.find( { user_id: { $regex: /bc/ } } ) |
SELECT *FROM peopleWHERE user_id like "bc%" | db.people.find( { user_id: /^bc/ } )-或-db.people.find( { user_id: { $regex: /^bc/ } } ) |
SELECT *FROM peopleWHERE status = "A"ORDER BY user_id ASC | db.people.find( { status: "A" } ).sort( { user_id: 1 } ) |
SELECT *FROM peopleWHERE status = "A"ORDER BY user_id DESC | db.people.find( { status: "A" } ).sort( { user_id: -1 } ) |
SELECT COUNT(*)FROM people | db.people.count()ordb.people.find().count() |
SELECT COUNT(user_id)FROM people | db.people.count( { user_id: { $exists: true } } )ordb.people.find( { user_id: { $exists: true } } ).count() |
SELECT COUNT(*)FROM peopleWHERE age > 30 | db.people.count( { age: { $gt: 30 } } )ordb.people.find( { age: { $gt: 30 } } ).count() |
SELECT DISTINCT(status)FROM people | db.people.aggregate( [ { $group : { _id : "$status" } } ] )或者,对于不超过 BSON 大小限制的非重复值集db.people.distinct( "status" ) |
SELECT *FROM peopleLIMIT 1 | db.people.findOne()ordb.people.find().limit(1) |
SELECT *FROM peopleLIMIT 5SKIP 10 | db.people.find().limit(5).skip(10) |
EXPLAIN SELECT *FROM peopleWHERE status = "A" | db.people.find( { status: "A" } ).explain() |
update操作
| SQL 更新语句 | MongoDB updateMany() 语句 |
|---|---|
UPDATE peopleSET status = "C"WHERE age > 25 | db.people.updateMany( { age: { $gt: 25 } }, { $set: { status: "C" } }) |
UPDATE peopleSET age = age + 3WHERE status = "A" | db.people.updateMany( { status: "A" } , { $inc: { age: 3 } }) |
delete操作
| SQL 删除语句 | MongoDB deleteMany () 语句 |
|---|---|
DELETE FROM peopleWHERE status = "D" | db.people.deleteMany( { status: "D" } ) |
DELETE FROM people | db.people.deleteMany({}) |