1、mongodb简介
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json 的bjson 格式,因此可以存储比较复杂的数据类型。MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。
1.1、面向集合(Collenction-Orented)
意思是数据被分组存储在数据集中, 被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。
1.2、 模式自由(schema-free)
对于存储在MongoDB 数据库中的文件,我们不需要知道它的任何结构定义。无需如关系型数据库一样提前定义表结构,或如ElasticSearch一样定义mapper映射。在Mongodb中,我们可以自由扩展或删除字段。
1.3、 文档型
Mongodb以bson格式存储数据,其类似于JSON结构,但对JSON的数据类型进行了扩充。其存储以bson文档格式的数据。我们存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档. 我们把这个数据格式称作 “BSON” 即 “Binary Serialized Document Notation”。
2、Mongodb特点
- 易于使用与扩展:不采用关系模型,面向集合存储,采用文档模型,便于开发者快速迭代;
- 索引丰富,支持二级索引,允许多种快速索引,如唯一索引、复合索引、地理空间索引、全文检索等;
- 支持聚合管道,用户能通过简单的片段创建复杂的聚合,并通过数据库自动优化。
- 支持丰富的集合类型,如TTL类型集合,固定大小集合等;
- 支持文件存储,基于一种易用的协议,存储大文件和文件元数据。
- 支持动态查询;
- 支持复制和故障恢复;
- 使用高效的二进制数据存储,包括大型对象(如视频等);
- 自动处理碎片,以支持云计算层次的扩展性;
- 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及C++语言的驱动程序,社区 中也提供了对Erlang 及.NET 等平台的驱动程序;
- 文件存储格式为BSON(一种JSON 的扩展);
- 可通过网络访问;
3、Mongodb功能简介
- 面向集合的存储:适合存储对象及JSON 形式的数据;
- 动态查询:MongoDB 支持丰富的查询表达式。查询指令使用JSON 形式的标记,可轻易查询文档中内嵌的对象及数组;
- 完整的索引支持:包括文档内嵌对象及数组。MongoDB 的查询优化器会分析查询表达式,并生成一个高效的查询计划;
- 查询监视:MongoDB 包含一系列监视工具用于分析数据库操作的性能;
- 复制及自动故障转移:MongoDB 数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移;
- 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片);
- 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器;
4、适用场景
- 网站数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性;
- 缓存:由于性能很高,MongoDB 也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB 搭建的持久化缓存层可以避免下层的数据源过载;
- 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储;
- 高伸缩性的场景:MongoDB 非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对MapReduce 引擎的内置支持;
- 用于对象及JSON 数据的存储:MongoDB 的BSON 数据格式非常适合文档化格式的存储及查询;
5、数据逻辑结构
MongoDB 的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的,用户使用MongoDB 开发应用程序使用的就是逻辑结构。
- MongoDB 的文档(document),相当于关系数据库中的一行记录。
- 多个文档组成一个集合(collection),相当于关系数据库的表。
- 多个集合(collection),逻辑上组织在一起,就是数据库(database)。
- 一个MongoDB 实例支持多个数据库(database)。
文档(document)、集合(collection)、数据库(database)的层次结构如下图:
mongodb与关系型数据库的逻辑结构对比:
MongoDB术语/概念 | SQL术语/概念 | 解释说明 |
---|---|---|
database | database | 数据库 |
collection | table | 数据库表/集合 |
document | row | 数据记录行/文档 |
field | column | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
6、数据存储结构
MongoDB 的默认数据目录是/data/db,它负责存储所有的MongoDB 的数据文件。在MongoDB内部,每个数据库都包含一个.ns 文件和一些数据文件,而且这些数据文件会随着数据量的增加而变得越来越多。所以如果系统中有一个叫做foo 的数据库,那么构成foo 这个数据库的文件就会由foo.ns,foo.0,foo.1,foo.2 等等组成。
MongoDB 内部有预分配空间的机制,每个预分配的文件都用0 进行填充,由于有了这个机制, MongoDB 始终保持额外的空间和空余的数据文件,从而有效避免了由于数据暴增而带来的磁盘压力过大的问题。
由于表中数据量的增加,数据文件每新分配一次,它的大小都会是上一个数据文件大小的2倍,每个数据文件最大2G。这样的机制有利于防止较小的数据库浪费过多的磁盘空间,同时又能保证较大的数据库有相应的预留空间使用。
数据库的每张表都对应一个命名空间,每个索引也有对应的命名空间。这些命名空间的元数据都集中在*.ns 文件中。
7、mongodb的数据类型
MongoDB文档存储是使用BSON类型,BSON(BSON short for Binary JSON, is a binary-encoded serialization of JSON-like documents)是二进制序列化的形式。类如JSON,同样支持内嵌各种类型。
MongoDB 常用数据类型:
数据类型 | 说明 | 示例 |
---|---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 | {"a" : "string"} |
Number | 数值类型。不区分整数和浮点数。 | {"a" : 1.34}或{"a" : 123} |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 | 整数:{"a" : 123}或 {"a" : NumberInt("3")} 或{"a" : NumberLong("3")} |
Boolean | 布尔值。用于存储布尔值(真/假)。 | {"a" : true} |
Double | 双精度浮点值。用于存储浮点值。 | {"a" : 1.34} |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 | |
Array | 用于将数组或列表或多个值存储为一个键。 | {"a" : ["b", "c" , "d", "e"]} |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 | |
Object | 用于内嵌文档。 | {"a" : {"b" : "c" , "d" : "e"}} |
Null | 用于创建空值。 | {"a" : null} |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 | |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 | {"a" : new Date()} |
Object ID | 对象 ID。用于创建文档的 ID。 (每个文档都有) | {"a" : ObjectId()} |
Binary Data | 二进制数据。用于存储二进制数据。 | {"a" : function() { /* ... */ }} |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 | |
Regular expression | 正则表达式 | {“a”:/^egon.*?nb$/i} |