大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?
让我们一起,一探究竟,了解一下MongoDB的特点和基本用法,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦
。
三分钟你将学会:
- MongoDB主要特征
- MongoDB优缺点,扬长避短
- 何时选择MongoDB?为啥要用它?
- MongoDB与MySQL关键字对比
- 下载与安装过程中一些常见的坑
- Java整合MongoDB,实现
农民工
增删改查
一、基本概念走起
MongoDB是一款开源、跨平台、分布式,具有大数据处理能力的文档存储数据库。
文档数据库MongoDB用于记录文档结构的数据,比如JSON、XML结构的数据。
二、MongoDB的主要特征
- 高性能。提供JSON、XML等可嵌入数据快速处理功能,提供文档的索引功能,以提高查询速度;
- 丰富的查询语言。为数据聚合、结构文档、地理空间提供丰富的查询功能;
- 高可用性。提供自动故障转移和数据冗余处理功能;
- 水平扩展能力。提供基于多服务器集群的分布式数据处理能力,具体处理时分主从和权衡(基于Hash自动推选)两种处理模式;
- 支持多种存储引擎。MongoDB提供多种存储引擎,
WiredTiger引擎
、MMAPv1引擎
是基于硬盘读写的存储引擎,In-Memory引擎
是基于内存的存储引擎;
三、MongoDB优缺点,扬长避短
1、优点
- Free-schema无模式文档,适应非结构化数据存储;
- 内置GridFS,支持大容量的存储;
- 内置Sharding,分片简单
- 弱一致性(最终一致),更能保证用户的访问速度;
- 查询性能优越,对于千万级别的文档对象,差不多10个G,对有索引的ID的查询不会比MySQL慢,而对非索引字段的查询,则是完胜MySQL;
- 聚合框架,它支持典型几种聚合操作 , 比如,Aggregate pipelien, Map-Reduce等;
- 支持自动故障恢复
2、缺点
- 太吃内存,快是有原因的,因为MongoDB把数据都放内存里了;
- 不支持事务操作;
- 占用空间过大;
- 不支持联表查询;
- 只有最终一致性,言外之意,就是可能造成数据的不一致,如果想要保持强一致性,必须在一个服务器处理所有的读写操作,坑;
- 复杂聚合操作通过mapreduce创建,速度慢
- Mongodb全局锁机制也是个坑;
- 预分配模式会带来的磁盘瓶颈;
- 删除记录时不会释放空间,相当于逻辑删除,这个真的坑;
- MongoDB到现在为止,好像还没有太好用的客户端工具;
四、何时选择MongoDB?为啥要用它?
1、MongoDB事务
MongoDB目前只支持单文档事务,MongoDB暂时不适合需要复杂事务的场景。
灵活的文档模型JSON格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代,可用复制集满足数据高可靠、高可用的需求,运维较为简单、故障自动切换可扩展分片集群海量数据存储。
2、多引擎支持各种强大的索引需求
- 支持地理位置索引
- 可用于构建各种O2O应用
- 文本索引解决搜索的需求
- TTL索引解决历史数据过期的需求
- Gridfs解决文件存储的需求
- aggregation & mapreduce解决数据分析场景需求,可以自己写查询语句或脚本,将请求分发到 MongoDB 上完成。
3、具体的应用场景
传统的关系型数据库在解决三高问题上的力不从心。
何为三高?
- High performance - 对数据库高并发读写的需求。
- Huge Storage - 对海量数据的高效率存储和访问的需求。
- High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求。
MongoDB可以完美解决三高问题。
4、以下是几个实际的应用案例:
(1)游戏场景
使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。
(2)物流场景
使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来,牛逼plus。
(3)社交场景
使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。
(4)物联网场景
使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。
(5)视频直播
使用MongoDB存储用户信息、点赞互动信息。
5、选择MongoDB的场景总结:
- 数据量大
- 读写操作频繁
- 数据价值较低,对事务要求不高
五、MongoDB与MySQL关键字对比
1、关键字对比
MySQL | MongoDB | 解释说明 |
---|---|---|
database | database | 数据库 |
table | collection | 表/集合 |
row | document | 行/文档 |
column | field | 字段/域 |
index | index | 索引 |
join | 嵌入文档 | 表关联/MongoDB不支持join,MongoDB通过嵌入式文档来替代多表连接 |
primary key | primary key | 主键/MongoDB自动将_id字段设置为主键 |
2、集合相当于MySQL中的表
集合就是一组文档。可以看作是具有动态模式的表。
集合具有动态模式的特性。这意味着一个集合中的文档可以具有任意数量的不同形态。
但是,将不同类型的文档存放在一个集合中会出现很多问题:
- 文档中可以存放任意类型的变量,但是,这里不建议将不同类型的文档保存在同一个集合中,开发人员需要确保每个查询只返回特定模式的文档,或者确保执行查询的应用程序代码可以处理不同类型的文档;
- 获取集合列表比提取集合中的文档类型列表要快得多,减少磁盘查找次数;
- 相同类型的文档存放在同一个集合中可以实现数据的局部性,对于集合,让使用者见文知意;
- 集合中只存放单一类型的文档,可以更高效地对集合进行索引;
3、集合的命名
- 集合名称中不能是空字符串;
- 集合名称不能包含