相比Mysql为什么还需要MongoDB、使用场景...
原创
1 简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
MongoDB 文档类似于 JSON 对象。
字段值可以包含其他文档,数组及文档数组。
简介、部署配置参考以下我另一篇文档
https://cloud.tencent.com/developer/article/1706615 (01 . MongoDB简介及部署配置)

https://cloud.tencent.com/developer/article/1997303?areaSource=&traceId= 02 . MongoDB复制集,分片集,备份与恢复

2 MongoDB优缺点
2.1 优点
- 高性能。提供JSON、XML等可嵌入数据快速处理功能,提供文档的索引功能,以提高查询速度;
- 丰富的查询语言。为数据聚合、结构文档、地理空间提供丰富的查询功能;
- 高可用性。提供自动故障转移和数据冗余处理功能;
- 水平扩展能力。提供基于多服务器集群的分布式数据处理能力,具体处理时分「主从」和「权衡」(基于Hash自动推选)两种处理模式;
- 支持多种存储引擎。MongoDB提供多种存储引擎,WiredTiger引擎、MMAPv1引擎是基于硬盘读写的存储引擎,In-Memory引擎是基于内存的存储引擎。
- MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
- 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
- 查询性能优越,对于千万级别的文档对象,差不多10个G,对有索引的ID的查询不会比MySQL慢,而对非索引字段的查询,则是完胜MySQL;
- 弱一致性(最终一致),更能保证用户的访问速度;
- 聚合框架,它支持典型几种聚合操作 , 比如,Aggregate pipelien, Map-Reduce等;
- 如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上,这就是所谓的分片(简单)。
- 支持故障自动恢复(对运维比较友好)。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
- Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
- Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
- GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
- MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
- MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C* 等多种语言。
2.2 缺点
- 太吃内存,快是有原因的,因为MongoDB把数据都放内存里了;
- 对事务的支持不够友好;
- 占用空间过大;
- 对联表查询的支持不够强大;
- 只有最终一致性,言外之意,就是可能造成数据的不一致,如果想要保持强一致性,必须在一个服务器处理所有的读写操作,坑;
- 复杂聚合操作通过mapreduce创建,速度慢
- Mongodb全局锁机制也是个坑;
- 预分配模式会带来的磁盘瓶颈;
- 删除记录时不会释放空间,相当于逻辑删除,这个真的坑;
- MongoDB到现在为止,好像还没有太好用的客户端工具(我用的 mongoDB Compass)。
3 为啥用它
3.1 MongoDB 事务
MongoDB目前只支持单文档事务,MongoDB暂时不适合需要复杂事务的场景。灵活的文档模型JSON格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代,可用复制集满足数据高可靠、高可用的需求,运维较为简单、故障自动切换可扩展分片集群海量数据存储(对开发、运维友好)。
3.2 多引擎支持各种强大索引需求
支持地理位置索引
可用于构建各种O2O应用
文本索引解决搜索的需求
TTL索引解决历史数据过期的需求
Gridfs解决文件存储的需求
aggregation & mapreduce解决数据分析场景需求,可以自己写查询语句或脚本,将请求分发到 MongoDB 上完成。
3.3 具体应用场景
传统的关系型数据库在解决三高问题上的力不从心。何为三高?
- High performance - 对数据库高并发读写的需求。
- Huge Storage - 对海量数据的高效率存储和访问的需求。
- High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求。
MongoDB可以完美解决三高问题。
- 大数据量和高写入负载:MongoDB 在处理大量数据和高并发写入时表现出色。它的水平扩展能力非常好,可以轻松处理大规模数据集和高流量负载。
- 实时数据分析:MongoDB 提供了强大的聚合框架和灵活的查询语言,可以进行实时数据分析。您可以使用它来对数据进行聚合、筛选和分组,以获得有关数据集的有价值见解。
- 内容管理系统:对于需要存储和管理大量结构化和非结构化数据的内容管理系统,MongoDB 是一个理想的选择。它的灵活模式和可扩展性使其能够适应不断变化的内容需求。
- 社交网络和博客平台:MongoDB 的文档模型非常适合存储用户生成的内容,例如社交媒体帖子、评论和博客文章。它的索引和查询功能使得在大规模数据集中进行快速搜索和检索变得容易。
- 实时应用程序:如果您的应用程序需要处理实时数据,例如聊天应用程序或实时分析仪表板,MongoDB 可以提供高性能和低延迟的数据访问。
- 物联网(IoT)应用程序:MongoDB 可以轻松处理物联网设备生成的大量数据。它的可伸缩性和灵活性使其成为存储、查询和分析传感器数据的理想选择。
请注意,这只是一些常见的使用场景,MongoDB 可以适用于各种其他应用程序和领域。选择是否使用 MongoDB 还取决于您的具体需求、数据模型和预期的数据操作。
以下是几个实际的应用案例:
3.3.1 游戏场景
使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。
3.3.2 物流场景
使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来,牛逼plus。
3.3.3 社交场景
使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。
3.3.4 物联网场景
使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。
3.3.5 视频直播
使用MongoDB存储用户信息、点赞互动信息。
4 Go语言操作 MongoDB
https://cloud.tencent.com/developer/article/1876752?areaSource=&traceId= (Go操作MongoDB)

4 小结
选择 MongoDB 场景总结
- 数据量大(快速扩展)
- 读写并发操作频繁
- 实时数据分析和灵活性较高
- 数据价值较低,对事务要求不高
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com删除。