MongoDB 是一个开源的、跨平台的、面向文档的、基于分布式文件存储的数据库系统,MongoDB 是由 C++ 语言开发,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。在高负载的情况下,通过添加更多的节点,可以保证服务器性能。
本篇内容主要包括:MongoDB 概述、MongoDB 的体系结构、关于 BSON
文章目录
- 一、MongoDB 概述
- 1、MongoDB 简介
- 2、文档数据库
- 3、MongoDB 特点
- 二、MongoDB 的体系结构
- 1、MongoDB 数据逻辑结构
- 2、与关系型数据库的术语类比
- 3、MongoDB 数据存储结构
- 三、关于 BSON
- 1、Bson 概念
- 2、Bson 与 Json 的区别
一、MongoDB 概述
1、MongoDB 简介
MongoDB 是一个开源的、跨平台的、面向文档的、基于分布式文件存储的数据库系统,MongoDB 是由 C++ 语言开发,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。在高负载的情况下,通过添加更多的节点,可以保证服务器性能。
MongoDB 常常被归类为 NoSQL 数据库系统,也是当前 NoSQL 数据库中比较热门的一种。
2、文档数据库
MongoDB 文档类似于 Json 对象。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。字段值可以包含其他文档,数组及文档数组。
使用文档的优点是:
- 文档(即对象)对应于许多编程语言中的内置数据类型。
- 嵌入式文档和数组减少了对昂贵连接的需求。
- 动态模式支持流畅的多态性。
Ps:MongoDB 将文档存储在集合中。集合类似于关系数据库中的表。
3、MongoDB 特点
MongoDB 作为非关系性文档数据库有着以下几个主要特点:
- 高性能:MongoDB 提供了高性能的数据持久化方式,包括了对嵌入式数据模型的支持(减少了数据库系统上的 I/O 操作)。对更多的索引类型的支持(更快的查询),并且可以包含来自嵌入式文档和数组的键;
- 高可用:MongoDB 的复制工具(称为副本集)提供:自动故障转移、数据冗余。副本集是一组维护相同数据集合的 MongoDB 实例,提供了冗余和提高了数据可用性;
- 水平拓展:MongoDB 提供水平可伸缩性作为其核心功能的一部分:分片将数据分布在一个集群的机器上。从 3.4 开始,MongoDB 支持基于分片键创建数据区域。在平衡群集中,MongoDB 仅将区域覆盖的读写定向到区域内的那些分片;
- 丰富的查询语言:MongoDB 支持丰富的查询语言以支持读写操作(CRUD)以及:数据聚合、文本搜索和地理空间查询;
- 支持多种存储引擎:MongoDB支持多个存储引擎:WiredTiger 存储引擎(包括对静态加密的支持 )、内存存储引擎。 另外,MongoDB 提供可插拔的存储引擎 API,允许第三方为 MongoDB 开发存储引擎。
二、MongoDB 的体系结构
1、MongoDB 数据逻辑结构
MongoDB的一个实例,由多个数据库(Database)组成;一个数据库,由多个集合(Collection)组成;一个集合,又由多个文档(Document)组成!
以关系型数据库为对比对象,来讲一下上面这些概念的意思:
- 实例:MongoDB 实例和关系型数据库实例是一样的,由各种高速缓冲池以及后台进程组成,负责维护和访问数据库数据;
- 数据库(Database):MongoDB 的数据库和关系型数据库也是差不多的概念,一个 MongoDB 实例可以承载多个数据库。不过需要注意的是:
- 不同的数据库拥有独立的权限,即使在磁盘上,不同数据库也放在不同的文件中;
- MongoDB 中有三个特殊的数据库:admin(可以看做“root”数据库)、local(本地数据库,永远都不可以复制,且一台服务器上的所有本地集合都可以放在这个数据库中)、config(用于分片设置,保存分片信息);
- 集合(Collection):集合可以看做是关系型数据库中的表,不同的是关系型数据库中的表存放的是表数据,但 Collection 存放的是文档。需要注意的是:集合是“动态模式”的,对于文档的格式没有要求,所以十分自由。
- 文档(Document):MongoDB 是一种面向文档的数据库,文档也是 MongoDB 中数据的基本单元,可以类比看作关系型数据库中的一行数据。
2、与关系型数据库的术语类比
MongoDB | 关系型数据库 |
---|---|
Database | Database |
Collection | Table |
Document | Record/Row |
Filed | Column |
Embedded Documents | Table join |
3、MongoDB 数据存储结构
MongoDB的默认数据目录是 /data/db
,它负责存储所有的 MongoDB 的数据文件。在 MongoDB 内部,每个数据库包含一个 *.ns 文件和一些数据文件,而且这些数据文件会随着数据量的增加而变得越来越多。
MongoDB 内部有预分配空间的机制,每个预分配的文件都用 0 进行填充,由于有了这个机制,MongoDB 始终保持额外的空间和空余的数据文件,从而有效避免了由于数据暴增而带来的磁盘压力过大的问题。
数据库的每张表都对应一个命名空间,每个索引也有对应的命名空间。这些命名空间的元数据都集中在在 *.ns 文件中。
三、关于 BSON
1、Bson 概念
MongoDB 作为一款流动的文档数据库,采用 Bson 格式来支持文档模型。
Bson是 由 10gen 开发的一个数据格式,目前主要用于 MongoDB 中,是 MongoDB 的数据存储格式。Bson 基于 Json 格式,选择 Json 进行改造的原因主要是 Json 的通用性及 Json 的 schemaless 的特性。
Bson 全称是 Binary Json,和 Json 很像,但是是采用二次格式进入存储,它和 Json 一样,支持内嵌的文档对象和数组对象,但是 Bson 有 Json 没有的一些数据类型,如 Date 和 BinData 类型。
# 一个 Document 的 Bson 表示
{
title:"MongoDB",
last_editor:"192.168.1.122",
last_modified:new Date("27/06/2011"),
body:"MongoDB introduction",
categories:["Database","NoSQL","Bson"],
revieved:false
}
# 一个嵌套的例子:
{
name:"lemo",
age:"12",
address:{
city:"suzhou",
country:"china",
code:215000
} ,
scores:[
{"name":"english","grade:3.0},
{"name":"chinese","grade:2.0}
]
}
2、Bson 与 Json 的区别
Bson 相对 Json 有以下优势:
- 更快的遍历速度:对 Json 格式来说,太大的 Json 结构会导致数据遍历非常慢。在 Json 中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,比如括号的匹配。而 Bson 对 Json 的一大改进就是,它会将 Json 的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接 seek 到指定的点上进行读取了。
- 操作更简易:对 Json 来说,数据存储是无类型的,比如你要修改基本一个值,从 9 到 10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用 Bson,你可以指定这个列为数字列,那么无论数字从 9 长到 10 还是 100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。当然,在 MongoDB 中,如果数字从整形增大到长整型,还是会导致数据总长变大的。
- 增加了额外的数据类型:Json 是一个很方便的数据交换格式,但是其类型比较有限。Bson在其基础上增加了 “byte array” 数据类型。这使得二进制的存储不再需要先 base64 转换后再存成Json,大大减少了计算开销和数据大小。当然,在有的时候,Bson 相对 Json 来说也并没有空间上的优势,比如对
{“field”:7}
,在 Json 的存储上 7 只使用了一个字节,而如果用 Bson,那就是至少 4 个字节(32位)
目前在 10gen 的努力下,BSO N已经有了针对多种语言的编码解码包。并且都是 Apache 2 license 下开源的。并且还在随着 MongoDB 进一步地发展。