Not Only SQL (三) - MongoDB Introduce & CRUD (上)

2022-08-19 16:48:06 浏览数 (1)

一、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()
代码语言:javascript复制
# 使用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()方法获取

当主键也是一个文档时,该主键称为复合主键。复合主键仍然要满足文档主键的唯一性。

0 人点赞