MongoDB 是一种跨平台、基于分布式文件存储的面向文档(document-oriented)的开源数据库。用它创建的数据库可以实现高性能、高可用性,并且易于扩展。它主要由 C++ 编写,2007 年 10 月开始开发,并在 2009 年 2 月发布初始版本。
特点
MongoDB 社区版是免费的,它提供了了 Windows、Linux 和 OS X 二进制版本,源码库在 https://github.com/mongodb/mongo。
易于使用
- MongoDB 是面向文档的数据库,而非关系型数据库,不再有行(row)的概念,文档模型更易于使用;
- MongoDB 作为列式存储,无需预定义模式(predefined schema),字段无需固定类型和大小,无固定模式,便于随时添加和删除。
易于扩展
- MongoDB 采用横向扩展(scale out),面向文档的数据模型使 MongoDB 很容易地在多台服务器之间进行数据分割;
- MongoDB 能自动处理跨集群的数据和负载,自动重新分配文档,以及将用户请求路由到正确的机器上。
丰富的功能
MongoDB 除了能够创建、读取、更新和删除数据之外,还提供了一系列不断扩展的独特功能。
-
索引(indexing)
MongoDB 支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、地理空间索引,以及全文索引。
-
聚合(aggregation)
MongoDB 支持“聚合管道”(aggregation pipeline)。用户能通过简单的片段创建复杂的聚合,并通过数据库自动优化。
-
特殊的集合类型
MongoDB 支持可以设置过期时间的集合,适用于那些将在某个时刻过期的数据,如会话(session)。类似地,MongoDB 也支持固定大小的集合,用于保存近期数据,如日志。
-
文件存储(file storage)
MongoDB 支持一种非常易用的协议,用于存储大文件和文件元数据。
卓越的性能
MongoDB 的一个主要目标是提供卓越的性能。
- MongoDB 能对文档进行动态填充(dynamic padding),也能预分配数据文件以利用额外的空间来换取稳定的性能;
- MongoDB 把尽可能多的内存用作缓存(cache),试图为每次查询自动选择正确的索引。
历史
MongoDB 由 MongoDB Inc.(当时是 10gen 团队)于 2007 年 10 月开发,并在 2009 年 2 月首度推出。具体历史发展如下:
- 2007 年 10 月开始开发,并在 2009 年 2 月发布初始版本;
- 2012 年 5 月 23 日,MongoDB 2.1 开发分支发布。该版本采用全新架构,包含诸多增强;
- 2012 年 6 月 6 日,MongoDB 2.0.6 发布,支持分布式;
- 2013 年 4 月 23 日,MongoDB 2.4.3 发布;
- 2013 年 8 月 20 日,MongoDB 2.4.6 发布;
- 2013 年 11 月 1 日,MongoDB 2.4.8 发布;
- 2017 年 3 月 17 日,MongoDB 3.0.1 发布;
- 2018 年 8 月 6 日,MongoDB 4.0.2 发布,支持多文档事务;
- 2019 年 8 月 13 日,MongoDB 4.2.0 发布,引入分布式事务。
MongoDB 概念
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象,它的基本的概念是文档、集合、数据库。
为了更好的理解 MongoDB 的概念,下面列出与其它数据库概念及术语的对比:
MongoDB | 关系型数据库(如 MySQL) | Elasticsearch | 描述 |
---|---|---|---|
Database | Database | Index | 数据库 |
Collection | Table | Type | 数据库 集合/表 |
Document | Row | Document | 数据 文档/记录 |
Field | Column | Field | 数据 字段、列/域 |
Schema | Mapping | 数据 组织结构/映射 | |
index | index | - | 索引 |
_id | primary key | _id | 主键,MongoDB 自动将 _id 字段设置为主键,与 es 相同 |
MongoDB SQL | SQL | DSL | MongoDB 自身的 CRUD 语言 |
范例文档
下面这个范例展示了一个简单的博客站点的文档结构,它是由逗号分隔的键值对构成的。
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100,
comments: [
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2011,1,20,2,15),
like: 0
},
{
user:'user2',
message: 'My second comments',
dateCreated: new Date(2011,1,25,7,45),
like: 5
}
]
}
_id 是一个 12 字节长的十六进制数,它保证了每一个文档的唯一性。
在插入文档时,需要提供 _id。如果你不提供,那么 MongoDB 就会为每一文档提供一个唯一的 id。
_id 的头 4 个字节代表的是当前的时间戳,接着的后 3 个字节表示的是机器 id 号,接着的 2 个字节表示 MongoDB 服务器进程 id,最后的 3 个字节代表递增值。