一、MongoDB Introduce
mongoDB是业界最受欢迎的非关系型数据库解决方案之一,是众多公司和开源项目的首要选择;这主要归功于mongoDB的下面这些优点
- 灵活性
- 可扩展性
- 强大的查询语言
- 优异的性能MongoDB是什么 首先MongoDB不是传统的关系型数据库,关系型数据库将数据存放在表格中,通过外键建立两张表或者多张表之间的联系,而mongoDB不存储表格,MongoDB是存储文档的非关系型数据库
除了MongoDB还有哪些非关系型数据库?
MongoDB数据库的结构
MongoDB文档支持的格式是JSON的扩展格式,也称之为BSON。同一个集合中的文档可以拥有完全不同的字段,例如描述客户信息的文档和描述账户信息的文档放在一个集合里,这种灵活性也是非关系型数据库的优势
创建并启动MongoDB服务
使用Docker创建并运行MongoDB
代码语言:javascript复制docker pull mongo:4
docker images
# 运行一个mongoDB容器,-v表示挂载数据的目录,-d表示后台运行
docker run --name mongoDB -v /mongoDB/data:/data/db -d mongo:4
docker ps
# 查看mongoDB运行日志
docker logs mongoDB
Mongo Express是一个基于网络的MongoDB数据库管理界面
代码语言:javascript复制docker pull mongo-express
# 运行mongo-express
docker run --link mongoDB:mongo -p 8081:8081 mongo-express
docker ps
浏览器输入ip:8081,就可以进行Mongo DB的管理界面
点击进入local数据库
点击_id可以查看一条文档记录
mongo shell是用来操作MongoDB的javascript客户端界面
代码语言:javascript复制# 容器中执行mongo命令进入mongo shell, 第二个mongo是进入mongo shell的命令
docker exec -it mongo mongo
mongo shell界面如下所示
支持javascript命令,退出使用exit命令就可以退出mongo shell
二、基本操作
- Create 创建
- Read 读取
- Update 更新
- Delete 删除
每篇文档都拥有一个专属_id字段即文档主键,具有唯一性,文档主键支持除数组外的所有数据类型
对象主键是MongoDB默认自动生成的文档逐渐,大小为12个字节并且包含了创建的时间,最好使用mongoDB默认生成的对象主键作为文档主键,这样可以避免主键冲突的情况
创建文档
- db.<collection>.insertOne()
- db.<collection>.insertMany()
- db.<collection>.insert()
- db.<collection>.save()
# 使用test数据库
use test
# 查看数据库中所有的集合
show collections
db.<collection>.insertOne()创建第一个文档
代码语言:javascript复制db.<collection>.insertOne(
<document>,
{
wirteConcern:<document>
}
)
- collection:文档将要写入的集合的名称
- document:文档本身
- writeConcern:定义了本次文档创建操作的安全写级别,安全写级别用来判断一次数据库写入操作是否成功,安全级别越高,丢失数据的风险越低,写入操作的延迟也越高,如果不提供writeConcern,MongoDB将使用默认的安全写级别
在命令行中执行文档写入操作
db.<collection>.insertOne()返回的也是一个BSON格式的数据
acknowledged:true表示安全写级别被启用,这里使用的是默认的安全写级别
insertedId:被写入的文档的_id
该命令会自动创建响应的集合
再一次往accounts集合中插入数据
使用try-catch可以处理插入文档时出现的异常
WriteError即输出的异常信息的文档,可以看出是由于主键冲突造成的异常。
插入数据时指定主键难免会出现主键冲突的情况,可以使用MongoDB的自动生成文档主键的功能,插入文档时不指定主键_id,MongoDB会使用默认生成主键的功能生成主键并返回
db.<collection>.insertMany()创建多个文档
代码语言:javascript复制db.<collection>.insertMany(
# 将多个文档作为数组,使用[]传入
[<document1>,<document2>,<document3>....]
{
wirteConcern: <document>,
ordered: <boolean>
}
)
- ordered:决定MongoDB是否按照顺序写入数组中的文档,默认为true。如果设置为false,MongoDB会打乱写入顺序,以便优化操作性能
db.<collection>.insertMany()返回的insertedIds是一个数组包含了插入文档的主键_id
顺序插入文档时遇到错误
使用find()命令查看集合中所有的文档,文档全部插入失败
在顺序写入时,一旦遇到错误,便会退出操作,剩下的文档无论是否正确都不会被写入数据库中
乱序插入文档时遇到错误
在乱序写入时,即使某些文档写入出现异常,剩余正确的文档仍然会被写入数据库 查看数据库中的数据
乱序写入出现异常时,name为strange1的文档仍然被写入数据库
db.<collection>.insert()创建一个或多个文档
代码语言:javascript复制db.<collection>.insert(
# 将多个文档作为数组,使用[]传入
<document> or [<document1>,<document2>,<document3>....]
{
wirteConcern: <document>,
ordered: <boolean>
}
)
使用db.<collection>.insert()命令插入一个或者多个文档
db.<collection>.insert()出现异常时同样可以使用try-catch输出异常信息
插入文档总结
三个命令的不同点
- insertOne、insertMany和insert插入成功的返回和异常返回的格式不同
- insertOne和insertMany命令不支持db.<collection>.explain()命令,insert()支持
db.<collection>.save()命令也可以创建一个或者多个文档,它是调用db.<collection>.insert()来完成创建的
默认的文档主键是ObjectId,里面包含了创建时间,可以通过调用getTimestamp()方法获取
当主键也是一个文档时,该主键称为复合主键。复合主键仍然要满足文档主键的唯一性。