英文官方文档:https://docs.mongodb.com/manual/
MongoDB 中文网:MonogDB 中文网 | MongoDB 中文文档
MongoDB 是一个文档数据库,旨在方便应用开发和扩展。
MongoDB is a document database designed for ease of application development and scaling.
MongoDB 非关系型数据库,但是它功能丰富,很像关系型数据库。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。
MongoDB 支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
特点:
应用场景:
传统安装方式:下载安装包、解压、配置环境变量 … 这里不采用这种方式。
使用 Docker 安装:
# 1.拉取 mongodb 镜像 docker pull mongo:5.0.5 # 2.运行 mongo 镜像 docker run -d --name mongo -p 27017:27017 mongo:5.0.5 # 3.进入 mongo 容器, bc6c为容器id docker ps # 查看容器id docker exec -it bc6c bash # 进入容器终端
Docker 指令参考:Docker 容器使用 | 菜鸟教程 (runoob.com)
参考:MongoDB 概念解析 | 菜鸟教程 (runoob.com)
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表 / 集合 |
row | document | 数据记录行 / 文档 |
column | field | 数据字段 /域 |
index | index | 索引 |
table joins | 表连接,MongoDB 不支持 | |
primary key | primary key | 主键,MongoDB 自动将 _id 字段设置为主键 |
RDB (Relational Database):关系型数据库
MongoDB 中的库就类似于 RDB 中库的概念,用来通过不同库隔离不同应用数据。
MongoDB 中可以建立多个数据库,每个库都有自己的集合和权限,不同的数据库放置在不同的文件中。
默认的数据库为 “test”,数据库存储在启动指定的 data 目录中。
集合就是 MongoDB 的文档组,类似于 RDB 中的表的概念。
集合存在于数据库中,一个库中可以创建多个集合。每个集合没有固定的结构,这意味着对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
文档是一组键值对(即 BSON)。
MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型。
上面这点与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
一个简单的文档例子:(与 JSON 看起来是一模一样)
{"user": "001", "name":"张三", "age": "15"}
MongoDB 创建数据库 | 菜鸟教程 (runoob.com)
MongoDB 删除数据库 | 菜鸟教程 (runoob.com)
MongoDB 中默认有 3 个保留库:
admin
从权限的角度来看,这是 “root” 数据库。
要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。
一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local
这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
即这个库中存储的数据仅当前服务器可见,其他服务器无法获取。
config
当 Mongo 用于分片设置时,config 数据库在内部使用,用于保存分片的相关信息。
# 显示所有库的列表 show dbs # show databses 简写 # 显示当前的数据库对象 db # 连接到指定数据库(无则创建) use mydb # 插入数据到mydb库中 db.mydb.insert({"name", "lzy"}) # 删除当前所处在的库中 db.dropDatabase()
使用 use 创建库后,直接
show dbs
看不见,因为 MongoDB 不显示没有数据的库。
MongoDB 创建集合 | 菜鸟教程 (runoob.com)
MongoDB 删除集合 | 菜鸟教程 (runoob.com)
# 查看库中的所有集合 show collections show tables
# 创建集合 db.createCollection('users')
db.createCollection(name, [options])
,options 可以是如下参数:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,则必须指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
# 如果不先创建集合, 直接插入一些文档,MongoDB 会自动创建集合。 db.teachers.insert({"name" : "zhangsan"})
# 删除指定集合 db.teachers.drop() # 删除teachers集合 db.users.drop() # 删除users集合
查询某个集合的所有文档:
# 查询某个集合的所有文档 db.users.find() # 查询users集合的数据
MongoDB 插入文档 | 菜鸟教程 (runoob.com)
MongoDB 中每个文档都会有一个
_id
作为唯一标识。
_id
默认会自动生成,如果手动指定将使用手动指定的值作为_id
的值。
# 往users集合插入单条数据 db.users.insert({"name": "zhangsan", "age": 23})
# 往users集合插入多条数据 # 插入多条可以使用 insert 也可以使用 insertMany db.users.insert([ {"name":"lisi", "age":16}, {"name":"wangwu", "age":18} ])
for (let i = 0; i < 3; i++) { db.users.insert({_id: i, name: 'user' + i, age: i+10}); } # 注意脚本执行完只会显示最后一条插入的记录, 所以是1 # WriteResult({ "nInserted" : 1 })
MongoDB 删除文档 | 菜鸟教程 (runoob.com)
# 语法 db.集合名称.remove( <query>, # 可选,删除条件 { justOne: <boolean>, # 可选,默认为false删除所有匹配的文档, 为true或1则只删除一个 writeConcern: <document> # 可选,抛出异常的级别 } )
# 删除集合中所有文档, 空条件必须传 {}, 不能不传 > db.users.remove({}) # 删除_id为1的文档 > db.users.remove({_id: 1}) # 删除_id是自动生成的数据 > db.users.remove({_id: ObjecteId("61fd0addc2df889b4ad70789")}})
MongoDB 更新文档 | 菜鸟教程 (runoob.com)
# 语法 db.collection.update( <query>, # 查询条件 <update>, # 更新内容,可以写对象或操作符 { upsert: <boolean>, # 可选,默认false不存在也不插入,为true则不存在就插入 multi: <boolean>, # 可选,默认false只更新查询到的第一条,为true则更新查询到的所有 writeConcern: <document> # 可选,抛出异常的级别 } )
# 默认会将 符合条件的文档 全部更新成后面的文档, 相当于先删除再插入(_id会保留) > db.users.update({age: 12},{age: 28}) # before: { "_id" : 2, "name" : "user2", "age" : 12 } # after: { "_id" : 2, "age" : 28 } # name丢失了 # 利用 $set 保留原来的数据进行更新 > db.users.update({name: "user1"}, {$set: {name: "用户1"}}) # before: { "_id" : 1, "name" : "user1", "age" : 23 } # after: { "_id" : 1, "name" : "用户1", "age" : 23 } # 其他字段都保留了 # 保留原来数据更新, 只更新符合条件的第一条数据 > db.users.update({age: 23}, {$set: {age: 25}}, {multi: false}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 保留原来数据更新, 更新满足条件的所有数据 (必须用 $set) > db.users.update({age: 23}, {$set: {age: 25}}, {multi: true}) WriteResult({ "nMatched" : 9, "nUpserted" : 0, "nModified" : 9 }) # 保留原来数据更新,更新满足条件的所有数据,没有数据时插入 > db.users.update({name: '小白'}, {$set: {name: '小黑'}}, {upsert: true}) $WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("61fd18ba88455f04936fe1e1") })