《Mongodb 实战》第二版 整体总结

全书主要介绍mongodb 数据库底层的实现,以及大型互联网web 项目的数据库设计原则

分为3个部分:

1.对mongodb 进行整体介绍

2.具体对mongodb 的文档数据模型,查询语言和CRUD操作进行介绍

3.介绍了mongodb 数据库的性能,部署,容错和伸缩性等

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 命令行:

  1. mongodump
  2. mongorestore
  3. mongoexport
  4. mongoimport
  5. mongostat
  6. mongotop
  7. mongooplog
  8. Bsondump

2.驱动的工作原理

所有mongodb 驱动主要执行以下三个功能:

首先,生成mongodb 对象ID,默认都存储在所有文档的_id 字段里。

其次,驱动会把任意语言表示的文档对象转换为BSON,或者从BSON转化回来。

最后,使用TCP socket 与数据库连接通信,此时使用的是MongoDB 自定义协议。

关系型数据库在服务端生成自增ID,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 -- 控制特定数据的访问

聚合框架管道的例子:

猜你喜欢

转载自blog.csdn.net/u014209205/article/details/108065907