mongoDB 是一个「文档型数据库,旨在简化开发和扩展」

这里很明显的确定了 mongoDB 的部分优势,那就是「简化开发和扩展」,那它是怎么简化开发和扩展的呢?这就是需要我们后面认真的去研究了。

然后,又提到了一个关键的词,「文档型数据库」,好了,到这里没有听过的朋友就蒙了,所以,我们往下看

什么是文档型数据库?

紧接着官方就给了说明,「MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组」

这句话其实讲的已经非常明了了,它记录的是一个文档,所以相比 Mysql 这种关系型数据库来说,moon 第一个想到的就是,「不用写 DDL 语句来维护表字段的关系了」,文档里面,你想怎么存就怎么存。

后面官方这里提到了文档数据库的「优点」:

  • 1.文档(即对象)对应于许多编程语言中的内置数据类型。

也就是说说文档内的「数据类型是自己定义」的,可以对应不同编程语言中的各种内置数据类型

  • 2.嵌入式文档和数组减少了对昂贵连接的需求。

最直白的说就是类似于 Mysql 当中的 Join 语句少了

  • 3.动态模式支持流畅的多态性。

这句话的 moon 是这样理解的,由于文档内容是自定义的,所以会有各种格式,比如下面这种格式就体现了其多态性

普通电话,具有打电话发短信的功能
{
 "type": "basic_phone",
 "message":1,
  "call":1
}
iphone,具有打电话发短信的功能,并且还能玩游戏
{
 "type": "iphone",
 "message":1,
  "call":1,
  "game":1
}

集合/视图/按需实例化视图

MongoDB 将文档存储在集合中。集合类似于关系数据库中的表。

这句话就很好理解了,我就不解释了

除集合外,MongoDB 还支持:

  • 只读视图(从MongoDB 3.4开始),和 SQL 的视图没有什么差异,视图是基于表/集合之上进行动态查询的一层对象,可以是虚拟的,也可以是物理的(物化视图)。
  • 按需实例化视图。从4.2版本开始,MongoDB 为 aggregation pipeline 添加了 $merge 阶段。此阶段可以将管道结果合并到现有集合中,而不是完全替换现有集合。此功能允许用户创建按需物化视图,每次运行管道时都可以更新输出集合的内容。

主要特性

后面就介绍到了 mongoDB 的一些主要特性

  • 高性能

    • 1.对嵌入式数据模型的支持减少了数据库系统上的I / O操作。

「什么是嵌入式的数据模型呢」?

MongoDB 提供高性能的数据持久化。特别是, 对嵌入式数据模型的支持减少了数据库系统上的 I / O 操作(不用连表查询了)。索引支持更快的查询,并且可以包含来自嵌入式文档和数组的键。

「为什么嵌入式模型可以减少数据库系统上的 I / O 操作?」

  • 丰富的查询语言

MongoDB 支持丰富的查询语言以支持读写操作(CRUD)以及:数据聚合 文本搜索和地理空间查询。

「其实数据库的核心作用就是两个,存储+查询」,各种不同的数据库几乎都是围绕着这两个点去设计的,所以查询方式也是非常重要的,MongoDB 并「不支持 sql 语句查询」,但是对于已经熟悉 sql 语句查询的人来说,官方给了我们一个很简单的理解方式,就是 sql 查询和 mongo 查询的对照

如上图 https://docs.mongodb.com/v4.2/reference/sql-comparison/

SELECT * FROM people = db.people.find
------------------------------------
SELECT user_id, status FROM people 
= 
db.people.find(
    { },
    { user_id: 1, status: 1, _id: 0 }
)
------------------------------------
SELECT user_id, status FROM people WHERE status = "A"
=
db.people.find(
    { status: "A" },
    { user_id: 1, status: 1, _id: 0 }
)

这样是不是就很容易去理解了

  • 高可用

MongoDB 的复制工具(称为副本集)提供:

1.「自动_故障转移」2.「数据冗余」

副本集是一组维护相同数据集合的 mongod 实例,提供了冗余和提高了数据可用性。

  • 水平拓展

MongoDB 提供水平可伸缩性作为其_核心_ 功能的一部分:分片将数据分布在一个集群的机器上。从 3.4 开始,MongoDB 支持基于分片键创建数据区域。在平衡群集中,MongoDB 仅将区域覆盖的读写定向到区域内的那些分片。

  • 支持多种存储引擎
    • WiredTiger 存储引擎(包括对静态加密的支持)
    • 内存存储引擎。
    • MongoDB 支持多个存储引擎:

另外,MongoDB 提供可插拔的存储引擎 API,允许第三方为 MongoDB 开发存储引擎。

这其实也是「类似于 mysql 存储引擎可拔插的设计」,比较容易理解

架构

作为一个新学习的数据库,「架构图也是我们了解其信息的重要手段之一」

我们可以看到,在 mongoDB 的架构中,核心的有三个组件

  • 数据分片(Shards)
    • 分片用于存储真正的集群数据,可以是一个单独的 Mongod实例,也可以是一个副本集。生产环境下Shard一般是一个 Replica Set,以防止该数据片的单点故障。
    • 对于分片集合(sharded collection)来说,每个分片上都存储了集合的一部分数据(按照分片键切分),如果集合没有分片,那么该集合的数据都存储在数据库的 Primary Shard中。
  • 配置服务器(Config Servers)
    • 保存集群的元数据(metadata),包含各个Shard的路由规则,也包括了 chunk (分片数据块)的信息。
  • 查询路由(Query Routers)
    • Mongos是 Sharded Cluster 的访问入口,其本身并不持久化数据 。Mongos启动后,会从 Config Server 加载元数据,开始提供服务,并将用户的请求正确路由到对应的Shard。
    • Sharding 集群可以部署多个 Mongos 以分担客户端请求的压力。

其实到了这里就基本差不多了,但是为了「加深」我们对于 mongoDB 的「印象」,我会去再看一下,「MongoDB 和 Mysql 到底有什么区别」

MongoDB 和 Mysql 有什么区别

总结

以上的知识对于一个新技术的入门来说,肯定是够用了 但是「重点还是在于归纳总结」,当你看完这些知识的时候,你脑海里对它有什么印象

对于 mongoDB ,当你看完这篇文章的时候,你需要知道它是一个

  • 「cp 类型的文档数据库」
  • 它有着自己「独特的数据查询方式」,操作语法是怎样的
  • 它支持「水平扩展」
  • 「自动故障转移和数据冗余(数据分散在不同的 shard 上,有备份)成就了它的高可用」
  • 一个请求打到 mongoDB 中需要一层「路由来将请求映射到具体的数据分片上」
  • 「支持单个文档的事物」。。。。。。