SQL与MongoDB之间的映射

76 阅读3分钟

写在前面

在sql编辑器里面写习惯了sql语法,偶尔写写MongoDB脚本,一时有点转换不过来,在这里记录一下SQL与MongoDB之间的映射关系。

MongoDB介绍

MongoDB是一个基于文档型存储的NoSQL数据库。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档、数组和文档数组。

A MongoDB document.

MongoDB中文网:MongoDB中文网

术语和概念

SQL 术语/概念MongoDB 术语/概念
databasedatabase
数据表(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 字段,则会自动添加主键 _iddb.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 peopledb.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 peopledb.people.find()
SELECT id, user_id, statusFROM peopledb.people.find( { }, { user_id: 1, status: 1 })
SELECT user_id, statusFROM peopledb.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 = 50db.people.find( { status: "A", age: 50 })
SELECT *FROM peopleWHERE status = "A"OR age = 50db.people.find( { $or: [ { status: "A" } , { age: 50 } ] })
SELECT *FROM peopleWHERE age > 25db.people.find( { age: { $gt: 25 } })
SELECT *FROM peopleWHERE age < 25db.people.find( { age: { $lt: 25 } })
SELECT *FROM peopleWHERE age > 25AND age <= 50db.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 ASCdb.people.find( { status: "A" } ).sort( { user_id: 1 } )
SELECT *FROM peopleWHERE status = "A"ORDER BY user_id DESCdb.people.find( { status: "A" } ).sort( { user_id: -1 } )
SELECT COUNT(*)FROM peopledb.people.count()ordb.people.find().count()
SELECT COUNT(user_id)FROM peopledb.people.count( { user_id: { $exists: true } } )ordb.people.find( { user_id: { $exists: true } } ).count()
SELECT COUNT(*)FROM peopleWHERE age > 30db.people.count( { age: { $gt: 30 } } )ordb.people.find( { age: { $gt: 30 } } ).count()
SELECT DISTINCT(status)FROM peopledb.people.aggregate( [ { $group : { _id : "$status" } } ] )或者,对于不超过 BSON 大小限制的非重复值集db.people.distinct( "status" )
SELECT *FROM peopleLIMIT 1db.people.findOne()ordb.people.find().limit(1)
SELECT *FROM peopleLIMIT 5SKIP 10db.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 > 25db.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 peopledb.people.deleteMany({})

参考