《一起学mongodb》之第一篇

微号:「moon聊技术」
关注选择“ 「星标」 ”, 重磅干货,第一 时间送达!
[如果你觉得文章对你有帮助,欢迎「关注,在看,点赞,转发」]

moon 的开场白

「一起学」》系别终于启动了,这个系列我主要会「按照我学习的思路」,给大家更新一下,为的是「学习方法和思路」,当然重要的还有知识,以及 moon 平常是怎么学习一个新的技术的

当然《「面试八股文」》系列后面还是会更新的,别慌,等我码字

好了,前话就说这么多,开始步入正题了~

初学 mongodb

「新学一个技术应该做什么」

「官方文档」,来,我们一起来看看官方文档是怎么说的

遇事不决,先看简介

image

这里第一句话很关键,文档上说,mongoDB 是一个「文档型数据库,旨在简化开发和扩展」

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

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

什么是文档型数据库?

image

紧接着官方就给了说明,「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 } 

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

image

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

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

除集合外,MongoDB 还支持:

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

主要特性

image

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

  • 高性能

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

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

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

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

  • 丰富的查询语言

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

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

image

`如上图 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 仅将区域覆盖的读写定向到区域内的那些分片。

  • 支持多种存储引擎

    • MongoDB 支持多个存储引擎:

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

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

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

架构

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

image

我们可以看到,在 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 MySQL
数据库模型 非关系型 关系型
存储方式 bson格式 不同引擎有不同的存储方式
查询语句 MongoDB查询方式 SQL语句
数据处理方式 基于内存,将热数据存放在物理内存中,从而达到高速读写 不同引擎有自己的特点
事务性 仅支持单文档事务操作,弱一致性 支持事务操作
占用空间 占用空间大 占用空间小
join操作 MongoDB没有join MySQL支持join

总结

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

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

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

入门就到这里了,后面我们再展开,包括「索引,分片原理,故障转移机制」等等

喜欢的朋友可以给 moon 来个星标,有文章都会第一时间推送给你,欢迎大家一起讨论

你可能感兴趣的:(《一起学mongodb》之第一篇)