11.MongoDB
MongoDB
由 C++ 语言编写,是一个基于分布式文件存储的开源数据库系统。支持的数据格式为 BSON
格式, 类 JSON
格式,因此可以存储非常复杂的数据,具有以下特点:
- 支持多种编程语言:Java、C++、PHP、C#、Python等。
- 面向文档存储: 文档格式为类JSON的BSON格式。
- 提供丰富的查询功能,支持对数据建立索引。
- 模式自由,可任意改变文档格式。
关于上述概念需要做些补充:关于 NoSQL 和 BSON
- NoSQL:NoSQL是不同于传统的关系数据库 [MySQL等] 的数据库管理系统的统称。
- 两者最大的不同点在于:NoSQL 不使用 SQL 作为查询语言
- NoSQL 数据存储格式无需固定
- 最受欢迎的 NoSQL 数据库分别是:
MongoDB
、Apache Cassandra
、Redis
、HBase
、LevelDB
- NoSQL 中的四大家族主要是:
列存储
、键值
、图像存储
、文档存储
- NoSQL 优势:
- 高可拓展性、分布式计算、架构灵活、半结构化数据、低成本
- BSON格式
- BSON 是 MongoDB 的数据存储格式,基于 JSON 格式。 BSON主要实现以下三点目标:
- 更快的遍历速度:舍弃JSON麻烦的数据结构匹配,将每个元素的长度存放于元素头部,可通过元素长度直接指定位置读取
- 操作更容易:对JSON而言,数据存储是无类型的。BSON会指定数据存储类型,根据数据存储类型变长存储
- 增加了额外的数据类型:BSON添加了
byte
、array
数据类型。使得二进制的存储不再需要先进行 base64 转换后在存储为 JSON这一过程,减少了计算开销和数据大小。
- BSON 是 MongoDB 的数据存储格式,基于 JSON 格式。 BSON主要实现以下三点目标:
废话不多说,直接上手进行安装 MongoDB。首先访问官网进行 安装包 下载。[msi 格式的直接安装版本即可]
运行 msi 安装包文件进行傻瓜式安装即可,这里需要注意 Choose Setup Type 时选择: Custom [自定义安装]。
常用命令:
- mongod,启动 MongoDB 数据库。通常指定一个数据存放目录,默认安装目录/data/db。可以通过下述命令进行指定特定数据存放目录:
- mongo,通过shell可以对 MongoDB 进行CURD等操作
- mongodump,备份数据库
- mongorestore,恢复数据库
运行MongoDB:/bin 目录下 运行 mongo.exe
创建账户进行访问控制,创建 baike 数据库,并在当前数据库中创建一个用户
数据库用户校验:使用 auth 命令进行用户验证
数据库操作命令查询:db.help()
插入文档
MongoDB 通过 集合 [Collection] 来管理数据库,类似数据库表。集合包含了多个文档 [Document],文档类似于数据库表记录。与关系型数据库的对比为:
MongoDB 不需要显式的创建集合,可以直接给集合添加文档。如下所示:
备注:_id
,MongoDB 中以下划线开头的字段都具有特殊意义。_id
表示文档主键,如果文档没有提供主键,则系统默认自动生成一个类型为 ObjectID 的主键。在Spring Boot应用中推荐由应用生成文档主键。
ObjectID
是 MongoDB 的一种特殊类型,用12字节存储,分别是4字节时间戳、3字节机器唯一标识、2字节进程标识、3字节自增标识。
查询文档:MongoDB支持按照主键查询,也可以根据条件进行查询,支持类似 and
、or
、in
等操作
- 查询所有文档:
db.collection.find({ })
- 条件查询文档
- and + 模糊匹配
- or
常用查询比较举例:
常用查询命令 | 释义[关系型数据库] |
---|---|
$gt | > |
$gte | >= |
$lt | < |
$lte | <= |
$eq | == |
$ne | != |
$in | in |
$nin | not in |
更新文档
MongoDB 更新操作类似关系型数据库,提供以下API:
db.collection.updateOne(<filter>, <update>, <options>)
db.collection.updateMany(<filter>, <update>, <options>)
db.collection.replaceOne(<filter>, <replacement>, <options>)
filter
表示查询条件,update
表示更新文档数据、options
表示可以控制更新特性。举个栗子:
更新文档结果为: 木问题
replaceOne 和 updateOne 的区别在于前者是替换整个文档,后者是更新部分文档。两者都只替换 匹配到的第一条记录
。如果有多条纪录匹配,可以使用 updateMany。
options
有如下属性可以控制更新特性:
- upsert:默认为false。设置为true,未匹配的文档会 insert 到数据库中。
- writeConcern,对写入进行配置,包含以下属性:
- w,默认是 {w: 0},表示写入后不需要向数据库发送确认信息[ACK],这样做性能很高;{w: 1},数据写入到数据库便向客户端发送确认;{w: majority"},写入所有节点后向客户端发送确认。
- wtimeout,当 w > 1 的时候,设置一个等待时间,单位为毫秒。如果超过这个时间,即使数据写入数据库中,客户端也得到一个错误信息。
删除文档
- 删除所有文档
- 条件删除文档