全书主要介绍mongodb 数据库底层的实现,以及大型互联网web 项目的数据库设计原则
分为3个部分:
1.对mongodb 进行整体介绍mongodb整体而言,还是一个数据库,更多的一个介绍都是从数据库的角度进行剖析。
2.具体对mongodb 的文档数据模型,查询语言和CRUD操作进行介绍
3.介绍了mongodb 数据库的性能,部署,容错和伸缩性等
mongodb 是优秀的Nosql 数据库,高性能,轻量级,易扩展。
1.全新的web数据库 它的数据结构是文档,不是行,
当我们修改数据时,我们不需要关注数据结构,而只需要修改数据,存储成结构化文档即可。
基于文档的数据模型,可以表示丰富的,多层次的数据结构。它经常用来处理无需多表关联查询的数据。(所以那需要多表关联怎么办)
因为没有一个标准的数据结构来约束,所以mongodb 有更大的一个灵活性。
数据库很大程度是由其数据模型定义的。
mongodb 的数据模型主要是面向文档的。
mongodb 以二进制json格式存储文档数据,已称为bson。
举例:理论上,每个文档,都可以有不同的数据结构,但实际中,也是大致一致的。
比如一篇新闻文档,如果要用关系型数据库来存储,如果遵从数据库设计范式,那需要多张表,并进行关联查询;而使用mongodb 这样的非关系型数据库,他是面向集合和文档的,直接把新闻文档存储成一个文档即可。
使用mongodb 开发应用就不需要担心未来可能的数据字段的变化。
mongodb 的设计目标之一就是保留大部分关系型数据库的功能。
在数据量时的查询,也是借助于索引,这是一个普遍存在的问题。
使用mongodb ,对于每个集合,我们可以最多创建64个索引。
复制是mongodb的有用特性,这个类似于其他关系型数据库的主从结构。
数据库的设计者不能两者兼得的一个特性是:速度和持久化,持久化到磁盘就注定要慢,要速度就会存储在内存中,在这两者中需要做一个权衡。
从mongodb 2..0开始,日志功能是默认开启的,开启后,默认100毫秒就会写一次日志文件。如果服务器意外关机,日志会通过重启服务器来确保mongodb 数据恢复为一致状态。
mongodb 使用C++编写。
mongodb 有单机模式和可复制集群模式,可复制集群模式由2台服务器加上一个mongod 作为裁判组成。最后,还有一个独立的mongos路由服务器,他用来在分片集群中转发不同的请求到后台服务器。
数据库驱动:常用的mongodb 命令行:
驱动是应用程序用来与mongodb 数据库通信的代码。
2.驱动的工作原理 所有mongodb 驱动主要执行以下三个功能:
- mongodump
- mongorestore
- mongoexport
- mongoimport
- mongostat
- mongotop
- mongooplog
- Bsondump
首先,生成mongodb 对象ID,默认都存储在所有文档的_id 字段里。关系型数据库在服务端生成自增ID,mongodb 是在驱动端生成的。
其次,驱动会把任意语言表示的文档对象转换为BSON,或者从BSON转化回来。
【mongodb|《Mongodb 实战》第二版 整体总结】最后,使用TCP socket 与数据库连接通信,此时使用的是MongoDB 自定义协议。
文章图片
3.schema 的设计原则 mongodb 里,最小的数据单元是BSON文档。
mongodb 支持主动查询,但是不支持join 连接查询。
mongodb 不支持事务。
最好的schema 设计通常是深入了解使用的数据库,了解应用系统的需求,以及具有丰富的经验之后的产物。
关系型数据库的强项主要是事务,再就是可以处理复杂的查询。
MongoDB 不需要rom 框架,因为它的 文档实际上就是对象的映射。
4.盖子集合 盖子集合指的是有上限的集合
最初是为高性能的日志场景设计的:一旦盖子集合达到最大的上限,后续插入的会覆盖之前插入的。
我们不能在盖子集合上使用TTL ,因为盖子集合不支持不同集合上的全部操作,比如删除文档。
MongoDB 文档的嵌套深度最大是100
5.构建查询 三种查询运算符:$in $all $nin
布尔运算符:$ne $not $or $and $nor $exists
6.查询选择 映射:通常用来选择子集的字段
$slice 选择返回文档的子集
7.聚合 聚合框架首先是定义一个管道
文章图片
聚合管道:一个操作的输出做为另一个操作的输入
$project -- 指定输出文档里的字段(项目化)
$match -- 选择要处理的文档,与find()类似
$limit -- 限制传递给下一步的文档数量
$skip -- 跳过一定数量的文档
$unwind -- 扩展数组,为每个数组入口生成一个输出文档
$group -- 根据key来分组文档
$sort -- 排序文档
$geoNear --选择某个地理位置附近的文档
$out -- 把管道的结果写入某个集合
$redact -- 控制特定数据的访问
聚合框架管道的例子:
文章图片
推荐阅读
- 数据库|SQL行转列方式优化查询性能实践
- mysql|一文深入理解mysql
- 达梦数据库|DM8表空间备份恢复
- 数据技术|一文了解Gauss数据库(开发历程、OLTP&OLAP特点、行式&列式存储,及与Oracle和AWS对比)
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- 谈灾难恢复指标(RTO与RPO是什么鬼())
- RPO与RTO
- 故障分析 | MongoDB 5.0 报错 Illegal instruction 解决