MongoDB

MongoDB

MongoDB 是一个文档数据库(以 JSON 为数据模型),C++ 编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,数据格式是 BSON,一种类似 JSON 的二进制形式的存储格式,简称 Binary JSON,和 JSON 一样支持内嵌的文档对象和数组对象,因此可以存储比较复杂的数据类型。

Mongo 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。原则上 Oracle 和 MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)。

MongoDB vs 关系型数据库

MongoDB 概念与关系型数据库(RDBMS)非常类似:

  • 数据库(database):最外层的概念,可以理解为逻辑上的名称空间,一个数据库包含多个不同名称的集合。
  • 集合(collection):相当于 SQL 中的,一个集合可以存放多个不同的文档。
  • 文档(document):一个文档相当于数据表中的一,由多个不同的字段组成。
  • 字段(field):文档中的一个属性,等同于(column)。
  • 索引(index):独立的检索式数据结构,与 SQL 概念一致。
  • _id:每个文档中都拥有一个唯一的 _id 字段,相当于 SQL 中的主键(primary key)。
  • 视图(view):可以看作一种虚拟的(非真实存在的)集合,与 SQL 中的视图类似。从 MongoDB 3.4 版本开始 提供了视图功能,其通过聚合管道技术实现。
  • 聚合操作$lookup):MongoDB 用于实现“类似”表连接(tablejoin)的聚合操作符。

MongoDB 与传统 RDBMS 仍然存在不少差异:

  • 半结构化,在一个集合中,文档所拥有的字段并不需要是相同的,而且也不需要对所用的字段进行声明。因此,MongoDB 具有很明显的半结构化特点。除了松散的表结构,文档还可以支持多级的嵌套、数组等灵活的数据类型,非常契合面向对象的编程模型。
  • 弱关系,MongoDB 没有外键的约束,也没有非常强大的表连接能力。类似的功能需要使用聚合管道技术来弥补。

MongoDB 的优势

基于灵活的 JSON 文档模型,非常适合敏捷式的快速开发

mongodb-rdb

  • 简单直观:从错综复杂的关系模型到一目了然的对象模型。
  • 快速:最简单快速的开发方式。JSON 结构和对象模型接近,开发代码量低。通常后端返回给前端的数据,都是 JSON 格式,基本上可以直接使用,不用再做转换。
  • 灵活:快速响应业务变化,JSON 的动态模型意味着更容易响应新的业务需求。例如,业务里需要实现一个功能,在传统的关系型数据库中,可能需要建很多张表,关联表之类的,然后再关联查询,而在 MongoDB 中,只需要新加一个字段就可以了,这个字段可以是一个内嵌文档。
  • 原生的高可用:复制集提供 99.999% 高可用。
  • 原生的高水平扩展能力:分片架构支持海量数据和无缝扩容。
ℹ️
MongoDB 的集合结构可灵活的修改,可以在集合中添加一个 version 字段,给每个文档添加一个版本号,每当业务变更,对集合结构进行修改时,增加版本号。例如 1.01.11.2 等等,这样就可以实现版本控制。在后面业务可以根据版本号来进行过滤。

应用场景

  • 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新
  • 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来
  • 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能;
  • 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析;
  • 视频直播,使用 MongoDB 存储用户信息、礼物信息等;
  • 大数据应用,使用云数据库 MongoDB 作为大数据的云存储系统,随时进行数据提取分析。

当前业务是否适合使用 MongoDB

没有某个业务场景必须要使用 MongoDB 才能解决,但使用 MongoDB 通常能让你以更低的成本解决问题。如果你不清楚当前业务是否适合使用 MongoDB,可以通过做几道选择题来辅助决策。

mongodb-select

只要有一项需求满足就可以考虑使用 MongoDB,匹配越多,选择 MongoDB 越合适。基本上 MongoDB 已经可以取代 MySQL 了。

MongoDB VS MySQL

性能:

MongoDB 的性能要优于 MySQL,MongoDB 天然支持分片集群,天然支持高可用(复制集)。

MySQL 的集群架构比较麻烦,做分库分表还需要中间件,而且处理海量数据的性能很差。MySQL 的定位就是一个单机数据库。

开发:

MongoDB 灵活的 schema,添加字段,添加内嵌文档无需修改,不会影响其他文档。非常适合敏捷开发。

MySQL 加一个字段需要修改表结构,如果要像 MongoDB 那样添加一个内嵌文档,可能需要一个关联表,一个新的表来存储内嵌文档。

最后更新于