mongodb基本概念

一、什么是mongodb

  开源的文档数据库,具有高性能、高可用、自动扩展,mongodb是用C++编写的非关系型数据库,可以存储更复杂的数据结构,具有很强的数据描述能力,语法规则相对复杂,没有类似于sql的操作语言。

  特点:高性能、高可用、可伸缩、易部署、易使用,存储数据十分方便

  主要特性:面向集合存储,易于存储对象类型的数据,模式自由,支持动态查询,支持完全索引,支持复制和故障恢复,使用高效的二进制数据存储,文件存储格式为 BSON ( 一种 JSON 的扩展)等。并且支持分布式,

  MongoDB 的高可用性体现在对副本集 Replication 的支持上,可伸缩性体现在分片集群的部署方式上。

MongoDB 的 Replication 集提供自动故障转移和数据冗余服务,Replication 结构可以保证数据库中的全部数据都会有多份备份,这与 HDFS 分布式文件系统的备份机制比较类似。采用副本集的集群中具有主(Master)、从(Slaver)、仲裁(Arbiter)三种角色。

  主从关系(Master-Slaver) 负责数据的同步和读写分离;Arbiter 服务负责心跳(Heartbeat)监控,Master 宕机时可将 Slaver 切换到 Mas 血状态,继续提供数据的服务,完成了数据的高可用需求。

  当需要存储大量的数据时,主从服务器都需要存储全部数据,可能会出现写性能问题。同时, Replication 主要解决的是读数据高可用方面的问题,在对数据库查询时也只限制在一台服务器上, 并不能支持一次查询多台数据库服务器,并没有满足数据库读写操作的分布式需求。

  MongoDB 提供水平可伸缩性功能的是分片(Shard)。分片与在 HDFS 分布式文件系统中上传文件会将文件切成 128MB(Hadoop2.x 默认配置)相似,通过将数据切成数片(Sharding)写入不同的分片节点,完成分布式写的操作。同时,MongoDB 在读取时提供了分布式读的操作,这个功能与 HDFS 的分布式读写十分类似。

  MongoDB 的安装和部署容易。

  支持丰富的查询语言、数据聚合、文本搜索和地理空间查询,用户可以创建丰富的索引来提升查询速度,MongoDB 被称为最像关系数据库的非关系数据库。

  MongoDB 允许用户在服务端执行脚本,可以用 Javascript 编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,使用时直接调用即可。MongoDB 支持各种编程语言,包括 Ruby、Python、Java、C++、PHPC# 等。

二、MongoDB 文档数据类型

  在数据量达到一定规模的情况下,传统关系型数据库反应迟钝,想解决这个问题就需要反其道而行之,尽可能去掉传统关系型数据库的各种规范约束,甚至事先无须定义数据存储结构。

  文档存储支持对结构化数据的访问,与关系模型不同的是,文档存储没有强制的架构。文档存储以封包键值对的方式进行存储,文档存储模型支持嵌套结构。例如,文档存储模型支持 XML  和 JSON 文档,字段的“值”可以嵌套存储其他文档,也可存储数组等复杂数据类型。
  MongoDB 存储的数据类型为 BSON,BSON 与 JSON 比较相似,文档存储模型也支持数组和键值对。

  MongoDB 的存储逻辑结构为文档,文档中采用键值对结构,文档中的 _id 为主键,默认创建主键索引。从 MongoDB 的逻辑结构可以看出,MongoDB 的相关操作大多通过指定键完成对值的操作。

 

 

   文档数据库无须事先定义数据存储结构,这与键值数据库和列族数据库类似,只需在存储时采用指定的文档结构即可。从上图可以看出,一个{}中包含了若干个键值对,大括号中的内容就被称为一条文档。

   MongoDB 文档数据库的存储结构分为四个层次,从小到大依次是:键值对、文档(document)、集合(collection)、数据库(database)。

  

 

 

   文档数据库存储结构的基本单位是键值对,具体包含数据和类型。键值对的数据包含键和值,键的格式一般为字符串,值的格式可以包含字符串、数值、数组、文档等类型。

  按照键值对的复杂程度,可以将键值对分为基本键值对和嵌套键值对。

    • 图 2 中的键值对中的键为字符串,值为基本类型,这种键值对就称为基本键值。
    • 嵌套键值对类型如图 3 所示,从图中可以看岀, contact 的键对应的值为一个文档,文档中又包含了相关的键值对,这种类型的键值对称为嵌套键值对。

 

 

   键(Key)起唯一索引的作用,确保一个键值结构里数据记录的唯一性,同时也具有信息记录的作用。例如,country:"China",用:实现了对一条地址的分割记录,“country”起到了 “China”的唯一地址作用,另外,“country”作为键的内容说明了所对应内容的一些信息。

  值(Value)是键所对应的数据,其内容通过键来获取,可存储任何类型的数据,甚至可以为空。

  键和值的组成就构成了键值对(Key-Value Pair)。它们之间的关系是一一对应的,如定义了 “country:China”键值对,"country”就只能对应“China”,而不能对应“USA”。

三、文档

  文档是 MongoDB 的核心概念,是数据的基本单元,与关系数据库中的行十分类似,但是比行要复杂。文档是一组有序的键值对集合。文档的数据结构与 JSON 基本相同,所有存储在集合中的数据都是 BSON 格式

  

 

 

 四、集合

  MongoDB 将文档存储在集合中,一个集合是一些文档构成的对象。如果说 MongoDB 中的文档类似于关系型数据库中的“行”,那么集合就如同“表”。

  集合存在于数据库中,没有固定的结构,这意味着用户对集合可以插入不同格式和类型的数据。但通常情况下插入集合的数据都会有一定的关联性,即一个集合中的文档应该具有相关性。

  

 

 

 五、数据库

  在 MongoDB 中,数据库由集合组成。一个 MongoDB 实例可承载多个数据库,互相之间彼此独立,在开发过程中,通常将一个应用的所有数据存储到同一个数据库中,MongoDB 将不同数据库存放在不同文件中。 

   

 

 

 六、BSON和JSON

  MongoDB 存储的数据格式与 JSON 十分类似,MongoDB 所采用的数据格式被称为 BSON,是一种基于 JSON 的二进制序列化格式,用于 MongoDB 存储文档并进行远程过程调用。

  JSON 是一种网络常用的数据格式,具有自描述性。JSON 的数据表示方式易于解析,但支持的数据类型有限。BSON 目前主要用于 MongoDB 中,选择 JSON 进行改造的原因主要是 JSON 的通用性及 JSON 的 schemaless 的特性。

  BSON 主要特性:

  1、更快的遍历速度。

    BSON头部有一个区域用来存储元素的长度, 当遍历时,如果想跳过某个文档进行读取,就可以先读取存储在 BSON 元素头部的元素的长度, 直接 seek 到指定的点上就完成了文档的跳过。

    在 JSON 中,要跳过一个文档进行数据读取,需要在对此文档进行扫描的同时匹配数据结构才可以完成跳过操作。

  2、操作更简单

    如果要修改 JSON 中的一个值,如将 9 修改为 10,这实际是将一个字符变成了两个,会导致其后面的所有内容都向后移一位。

    在 BSON 中,可以指定这个列为整型,那么,当将 9 修正为 10 时,只是在整型范围内将数字进行修改,数据总长不会变化。

    需要注意的是:如果数字从整型增大到长整型,还是会导致数据总长增加。

  3、支持更多的数据类型

    BSON 在 JSON 的基础上增加了很多额外的类型,BSON 增加了“byte array”数据类型。这使得二进制的存储不再需要先进行 base64 转换再存为 JSON,减少了计算开销。

 

posted @ 2020-03-26 19:38  久别重逢  阅读(880)  评论(0编辑  收藏  举报