MongoDB 基础教程

MongoDB 高级教程

MongoDB 笔记

MongoDB 简介


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 概念与其它数据库概念的对比
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 个字节代表递增值。