
MongoDB数据存储格式
JSON格式
JSON 数据格式与语言无关,脱胎于 JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json。MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。JSON数据库语句可以容易被解析。Web 应用大量使用,NAME-VALUE 配对
BSON格式
BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。 二进制的JSON,JSON文档的二进制编码存储格式。BSON有JSON没有的Date和BinData。MongoDB中document以BSON形式存放
例如:
> db.meeting.insert({meeting:“M1 June",Date:"2018-01-06"});
MongoDB的优势
📢 MongoDB是开源产品
📢 On GitHub Url:https://github.com/mongodb
📢 Licensed under the AGPL,有开源的社区版本
📢 起源& 赞助by MongoDB公司,提供商业版licenses 许可
这些优势造就mongodb的丰富的功能:JSON 文档模型、动态的数据模式、二级索引强大、查询功能、自动分片、水平扩展、自动复制、高可用、文本搜索、企业级安全、聚合框架MapReduce、大文件存储GridFS
高可用的复制集群
自动复制和故障切换
多数据中心支持滚动维护无需关机支持最多50个成员
水平扩展
这种方式是目前构架上的主流形式,指的是通过增加服务器数量来对系统扩容。在这样的构架下,单台服务器的配置并不会很高,可能是配置比较低、很廉价的 PC,每台机器承载着系统的一个子集,所有机器服务器组成的集群会比单体服务器提供更强大、高效的系统容载量。
这样的问题是系统构架会比单体服务器复杂,搭建、维护都要求更高的技术背景。分片集群架构如下图所示:

各存储引擎的对比
MySQL InnoDB |
MySQL NDB |
Oracle |
MongoDB MAPI |
MongoDB WiredTiger |
|
事务 |
YES |
YES |
ES |
NO |
NO |
锁粒度 |
ROW-level |
ROW-level |
ROW-level |
Collection-level |
Document-level |
Geospatial |
YES |
YES |
YES |
YES |
YES |
MVCC |
YES |
NO |
YES |
NO |
NO |
Replication |
YES |
YES |
YES |
YES |
YES |
外键 |
YES |
YES(From 7.3) |
YES |
NO |
NO |
数据库集群 |
NO |
YES |
YES |
YES |
YES |
B-TREE索引 |
YES |
YES |
YES |
YES |
YES |
全文检索 |
YES |
NO |
YES |
YES |
YES |
数据压缩 |
YES |
NO |
YES |
NO |
YES |
存储限制 |
64TB |
384EB |
NO |
NO |
NO |
表分区 |
YES |
YES |
YES |
YES (分片) |
YES (分片) |
数据库功能和性能对比
由下图可以看出MongoDB数据库的性能扩展能力及功能都较好,都能够在数据库中,站立一足之地。
MongoDB适用场景
网站数据、缓存等大尺寸、低价值的数据
在高伸缩性的场景,用于对象及JSON数据的存储。
MongoDB 慎用场景
慎用场景 |
原因 |
PB 数据持久存储大数据分析数据湖 |
Hadoop、Spark提供更多分析运算功能和工具,并行计算能力更强 MongoDB + Hadoop/Spark |
搜索场景:文档有几十个字段,需要按照任意字段搜索并排序限制等 |
不建索引查询太慢,索引太多影响写入及更新操作 |
ERP、CRM或者类似复杂应用,几十上百个对象互相关联 |
关联支持较弱,事务较弱 |
需要参与远程事务,或者需要跨表,跨文档原子性更新的 |
MongoDB 事务支持仅限于本机的单文档事务 |
100% 写可用:任何时间写入不能停 |
MongoDB换主节点时候会有短暂的不可写设计所限 |
什么时候该MongDB
应用特征 |
Yes/No? |
我的数据量是有亿万级或者需要不断扩容 |
|
需要2000-3000以上的读写每秒 |
|
新应用,需求会变,数据模型无法确定 |
|
我需要整合多个外部数据源 |
|
我的系统需要99.999%高可用 |
|
我的系统需要大量的地理位置查询 |
|
我的系统需要提供最小的latency |
|
我要管理的主要数据对象<10 |
在上面的表格中进行选择,但有1个yes的时候:可以考虑MongoDB;当有2个以上yes的时候:不会后悔的选择!

