MongoDB(文档数据库)的简单使用
MongoDB最好的学习资料就是他的官方文档:SQL 到 MongoDB 的映射图表 - MongoDB 手册 v8.0
1.SQL到MongoDB的映射表
下表列出各种SQL术语和概念以及相应的MongoDB术语和概念
传统关系型数据库中SQL术语/概念 | NoSQL型MongoDB数据库术语/概念 |
database | database |
数据表(table) | 集合(collection) |
行 | 文档或BSON文档 |
列 | 字段 |
索引(index) | 索引(index) |
表连接 | $lookup,嵌入式文档 |
主键 | 主键 |
指定任何唯一列或列组合作为主键 | 在MongoDB中,主键会自动设置为_id字段 |
聚合(例如分组依据) | 聚合管道(请参阅 SQL 聚合映射图表) |
SELECT INTO NEW_TABLE | $out( 请参阅SQL 聚合映射图表) |
MERGE INTO TABLE | $merge(请参阅 SQL 聚合映射图表) |
UNION ALL | $unionWith |
事务 | 事务(在许多场景中,非规范化数据模型(嵌入式文档和数组),而不是多文档事务,将继续是数据和使用案例的最佳选择。换言之,对于许多场景,适当地建模数据将最大限度地减少对多文档事务的需求) |
2.可执行程序的对比
Mongodb | MySQL | Oracle | |
数据库服务 | mongod | mysqld | oracle |
数据库客户端 | mongosh | mysql | sqlplus |
3.SQL语句之间的对比
如下代码表示在MongoDB中的一个集合中一条数据记录的状态;
示例:
{_id: ObjectId("509a8fb2f3f4948bd2f983a0"),user_id: "abc123",age: 55,status: 'A'
}
3.1创建和更改
下表列出了与表级动作相关的各种SQL语句以及对应的MongoDB语句。
(1)SQL模式语句
创建表:
CREATE TABLE people (id MEDIUMINT NOT NULLAUTO_INCREMENT,user_id Varchar(30),age Number,status char(1),PRIMARY KEY (id)
)
修改表:
ALTER TABLE people
ADD join_date DATETIME
ALTER TABLE people
DROP COLUMN join_date
创建索引:
CREATE INDEX idx_user_id_asc
ON people(user_id)
CREATE INDEXidx_user_id_asc_age_desc
ON people(user_id, age DESC)
删除表:
DROP TABLE people
(2)对应上述SQL语句的MongoDB语句
创建集合
a.隐式的创建一个集合
在第一个 insertOne() 或 insertMany() 操作上隐式创建。如果未指定 _id
字段,则会自动添加主键 _id
。
db.people.insertOne( {user_id: "abc123",age: 55,status: "A"} )
b.显示的创建一个集合
db.createCollection("people")
修改集合
集合并不描述或强制执行其文档的结构;也就是说,集合层面上不会有结构变化。
不过,在文档级别,updateMany() 操作可以使用 $set 操作符将字段添加到现有文档中。
db.people.updateMany({ },{ $set: { join_date: new Date() } }
)
集合并不描述或强制执行其文档的结构;也就是说,集合层面上不会有结构变化。
不过,在文档级别,updateMany() 操作可以使用 $unset 操作符从文档中删除字段。
db.people.updateMany({ },{ $unset: { "join_date": "" } }
)
创建索引
db.people.createIndex( { user_id: 1 } )
db.people.createIndex( { user_id: 1, age: -1 } )
删除集合
db.people.drop()
3.2Insert
(1)传统SQL
INSERT INTO people(user_id,age,status)
VALUES ("bcd001",45,"A")
(2)MongoDB
db.people.insertOne({ user_id: "bcd001", age: 45, status: "A" }
)
3.3Select
(1)传统SQL
(1)SELECT * FROM people(2)SELECT id,user_id,status FROM people(3)SELECT user_id, status FROM people(4)SELECT * FROM people WHERE status = "A"(5)SELECT user_id, status FROM people WHERE status = "A"(6)SELECT * FROM people WHERE status != "A"(7)SELECT * FROM people WHERE status = "A" AND age = 50(8)SELECT * FROM people WHERE status = "A" OR age = 50(9)SELECT * FROM people WHERE age > 25(10)SELECT * FROM people WHERE age < 25(11)SELECT * FROM people WHERE age > 25 AND age <= 50(12)SELECT * FROM people WHERE user_id like "%bc%"(13)SELECT * FROM people WHERE user_id like "bc%"(14)SELECT * FROM people WHERE status = "A" ORDER BY user_id ASC(15)SELECT * FROM people WHERE status = "A" ORDER BY user_id DESC(16)SELECT COUNT(*) FROM people(17)SELECT COUNT(user_id) FROM people(18)SELECT COUNT(*) FROM people WHERE age > 30(19)SELECT DISTINCT(status) FROM people(20)SELECT * FROM people LIMIT 1(21)SELECT * FROM people LIMIT 5 SKIP 10(22)EXPLAIN SELECT * FROM people WHERE status = "A"
(2)MongoDB
(1)db.people.find()(2)db.people.find({ },{ user_id: 1, status: 1 }
)(3)db.people.find({ },{ user_id: 1, status: 1, _id: 0 }
)(4)db.people.find({ status: "A" }
)(5)db.people.find({ status: "A" },{ user_id: 1, status: 1, _id: 0 }
)(6)db.people.find({ status: { $ne: "A" } }
)(7)db.people.find({ status: "A",age: 50 }
)(8)db.people.find({ $or: [ { status: "A" } , { age: 50 } ] }
)(9)db.people.find({ age: { $gt: 25 } }
)(10)db.people.find({ age: { $lt: 25 } }
)(11)db.people.find({ age: { $gt: 25, $lte: 50 } }
)(12)db.people.find( { user_id: /bc/ } )
或
db.people.find( { user_id: { $regex: /bc/ } } )(13)db.people.find( { user_id: /^bc/ } )
或
db.people.find( { user_id: { $regex: /^bc/ } } )(14)db.people.find( { status: "A" } ).sort( { user_id: 1 } )(15)db.people.find( { status: "A" } ).sort( { user_id: -1 } )(16)db.people.count()
或
db.people.find().count()(17)db.people.count( { user_id: { $exists: true } } )
或
db.people.find( { user_id: { $exists: true } } ).count()(18)db.people.count( { age: { $gt: 30 } } )
或
db.people.find( { age: { $gt: 30 } } ).count()(19)db.people.aggregate( [ { $group : { _id : "$status" } } ] )
或,对于不超过 BSON 大小限制的非重复值集
db.people.distinct( "status" )(20)db.people.findOne() 或 db.people.find().limit(1)(21)db.people.find().limit(5).skip(10)(22)db.people.find( { status: "A" } ).explain()
3.4Update
(1)传统SQL
UPDATE people
SET status = "C"
WHERE age > 25UPDATE people
SET age = age + 3
WHERE status = "A"
(2)MongoDB
db.people.updateMany({ age: { $gt: 25 } },{ $set: { status: "C" } }
)db.people.updateMany({ status: "A" } ,{ $inc: { age: 3 } }
)
3.5Delete
(1)传统SQL
DELETE FROM people
WHERE status = "D"DELETE FROM people
(2)MongoDB
db.people.deleteMany( { status: "D" } )db.people.deleteMany({})