一年多一直在使用mongodb,基本上从对mongodb不懂的小白,到现在操作mongodb无任何压力,最近的一个项目在做mongodb副本集的管理,三组机器做一个副本集,大概要管几十台上百台副本集,主要用来自动化发布,构建副本集(我们的mongo副本集部署在docker中),所以在写各种mongo shell的代码实现,说白了就是调用mongo的commands。看到这个问题特来回答一下。 mongodb众所周知不支持事务,所以需要强事务的业务根本不能考虑mongodb。 mongodb的优势就是文档存储: 1. 业务经常变动,需要不时的添加字段,那么mongodb比较适合,关系型数据库添加字段的复杂度也还好 2. 嵌套文档,业务数据比较复杂,适合嵌套文档式存储,那么mongodb非常合适,这个关系型数据库比较难搞,虽然MySQL和pg也有文档存储,但MySQL的不成熟,pg毕竟现在生产中使用还是偏少,个人也不了解,这里不谈。但这不仅仅这一点优势,具体下面会细说。 3. upsert支持,查询速度也不慢 4. 高可用的副本集支持 5. 查询语法非常丰富,嵌套文档查询功能非常强大,不是重度用户可能不能理解 下面说说一个具体的使用事例: 项目的一条数据在10kb左右,如果使用关系型数据库那么需要将这条数据拆分成大概几百条左右,建造多个表,设计较复杂,这种数据大概在一百万条左右,想想拆分后在十几亿的数据量就可怕。打平后的数据什么DB也都可以拿下,只是一百万变十几亿比较恐怖而已。 如果采用MySQL存储,每次查询需要使用外键查询多个表,从这些表中拉取数据,性能肯定要下降很多,比不上只在一个表查询,而且只拉取少两个数量级的数据。查询也还好,业务允许可以对结果做缓存,放到redis里去。 但是重点来了,需求要增量更新部分数据,这时候需要更新多个表,根本没法做到原子性(注意事务不是原子操作),当然也可以使用cas等技术补偿,达到最终一致性。但使用mongodb存储只需要update一条数据,对相应的嵌套文档中内容更新,可以做到原子性,是不是很方便? 具体说说该项目的难点,查询无法使用缓存,可能会很吃惊,但是业务决定了确实做不了,而且增量更新的量达到上万的QPS,如果不能保证原子性想想多么可怕! 所以mongodb在这里帮了大忙,关系型数据库解决不了这个难题。 有人可能要问,mongodb没有事务,上游数据写入也会有问题,你不可能所有数据都存一个表吧? 当然不是的,我们mongodb里的数据是从MySQL中清洗出来存到mongodb中的,mongodb只做单点的业务需求,综合的数据还是在MySQL中。 此项目我们用了上百个副本集,保证系统的高可用,这些副本集配置只要一条shell就搞定,如果用MySQL的主从不知道怎么配(我自己不懂),估计DBA得忙死,而该项目完全不需要也没用到DBA。 说了这么多mongo的优点,也说说他的缺点: 1. 查询优化器和MySQL没法比 2. 不支持reload,只能冷重启,初始化配置的时候比较麻烦 3. 没有事务,不敢存储第一手数据,多用来做备份数据的存储 mongodb可以做很多事情,取决于你脑洞,性能不差,存一些相对不重要的数据,mongodb嵌套文档功能强大,多看看官方文档挖掘挖掘有用信息,每次都能发现惊喜。 希望对你有用! 文中的图片,是我学习MongoDB之后做的技术分享PPT,可以关注我后发私信"资料"两个字,我会将完整PPT的下载链接发给你,只供个人学习使用哟。 什么是MongoDB 首先,我们对MongoDB下一个定义 ,它是一个数据库;再稍微详细一点儿,它是一个开源的、基于分布式文件存储的、非关系型数据库。说到非关系型数据库,最有名的可能就是Redis了,它是一种Key,Value类型的数据库,而MongoDB,它是文档型数据库的一种,它的存储方式类似于JSON。 我们常用的关系型数据库,在有着事务一致性 、支持复杂SQL、成熟、稳定等优点的同时,与此同时,也有诸如数据结构固定 、需要停机迁移等缺点。而MongoDB正是对关系型数据库进行了完美的补充,它有着数据模式自由 、便于弹性扩展的优点。 MongoDB中的一些基本概念,和关系型数据库对照着看,还是很好理解的: MongoDB中的文档相当于MySQL里面的一行数据(Record): MongoDB中的集合相当于MySQL里面的一张表(Table): 什么时候用MongoDB MongoDB更多适用于大数据量、高并发、弱事务、不确定数据类型 的应用; 特别是这里的"不确定数据类型",也是MongoDB最大的特点之一。 在以往的关系型数据库中,我们需要提前定义一个表的表结构,当表结构发生改变的时候,我们需要执行DDL语句。而MongoDB数据类型是很自由的,表中的每一行数据实际上都是一个JSON串,在同一张表中,每一个JSON串中的键值数量可以是不同的,键的内容可以是不同的,甚至是两个完全不同的JSON串可以共存在一张表中,并且MongoDB是无需事先创建表结构或修改表结构,所有的改变都是动态的。 但是MongoDB不适用高度事务性的系统;它可以用于对象及JSON数据的存储,或者是一些大尺寸,低价值的数据存储,而且由于性能很高,MongoDB也适合作为应用的缓存层。 所以总结来说,关系型数据库和非关系型数据库MongoDB是不存在谁替代谁的问题,他们应该是各有优势,相互补充的。就好像我们平时用的无线键盘和机械键盘一样,无线键盘灵活轻便、外观比较时尚,而机械键盘手感出色、跪起来很舒服,不伤膝盖,各有优势。 以上是我对MongoDB简单分享,如果大家想更深入的了解MongoDB,可以随时找我交流,我是一个喜欢分享的人,比如你们很多人家里的无线路由器,都设密码,不在家的时候还会把无线关了,一点分享的精神都没有。而我,就一直开着无线路由器,也从不设密码,让周围的人可以搜到我的信号,连接成功,我就会很开心。虽然我没装宽带,但我觉得这并不重要,因为我的分享,给了他们带来了希望和快乐。 希望我的解答能帮助你! 是一种存储json对象,并提供快速查询,删除和更新的新一代数据库服务软件。可以类比mysql或者sqlserver。但跟传统数据库不同,它不依赖schema(类似mysql的table定义)和关系约束。它可以存任何json对象,并提供多种方法进行查询,聚合,映射。 由于原生json支持,特别适合作为node的数据库。node中比较知名的mongoose,把mongodb进行了包装,提供schema检验,关系查询,等传统sql的功能,通过promise提供并行批量数据库操作,事务性也可以由第三方插件提供。再结合redis的内存缓存服务,和kareem提供的hook功能。基本上可以优雅的完成自动缓存查询,自动缓存更新。因此,用node快速开发情况下会选择mongodb。 这个主要看业务,大部分用于存储一些日志,统计相关的数据,如果不要求事物的话mongo是很好的选择,天生具备分布式扩展,大数据量存储。我们是用java操作,用的spring data mongodb,具体你可以百度猿天地,里面有视频教程 随着云计算的高速发展,越来越多的应用需要存储海量数据,并且对高并发和处理海量数据提出了更高的要求,传统的关系型数据库对于这些应用场景难以满足应用需求。 作为NoSQL数据库之一的MongoDB数据库能够完全满足和解决在海量数据存储方面的应用,越来越多的大网站和企业选择MongoDB代替Mysql进行存储。什么是MongoDB? MongoDB[1] 是一个基于分布式文件存储的数据库。由C 语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB[2] 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 MongoDB的主要特点 (1)文件存储格式为Bson,使用易于掌握和理解的Json风格语法。相对Json来说,Bson拥有更好的性能,主要表现为更快的遍历速度、操作更简易、增加了额外的 数据类型。 (2)模式自由,支持嵌入子文档和数组,无需事先创建数据结构,属于逆规范化的数据模型,有利于提高查询速度。 (3)动态查询,支持丰富的查询表达式,使用Json形式的标记,可轻易查询文档中内嵌的对象和数组及子文档。 (4)完整的索引支持,包括文档内嵌对象和数据,同时还提供了全文索引方式,MongoDB的查询优化器会分析查询表达式,并生成一个高效的查询计划。 (5)使用高效的二进制数据存储,适合存储大型对象(如高清图片、视频等)。 (6)支持多种复制模式,提供冗余及自动故障转移。支持Master-Slave、Replica Pairs/Replica Sets、有限Master-Master模式。 (7)支持服务端脚本和Map/Reduce,可以实现海量数据计算,即实现云计算功能。 (8)性能高、速度快。在多数场合,其查询速度对于MySQL要快的多,对于CPU占用非常小。部署很简单,几乎是零配置。 (9)自动处理碎片,支持自动分片功能实现水平扩展的数据库集群,可以动态添加或移除节点。 (10)内置GridFS,支持海量存储。 (11)可通过网络访问,采用高效的MongoDB网络协议,在性能方面要优于http或Rest协议。 (12)第三方支持丰富,MongoDB社区活跃,越来越多的公司和网站在生产环境中使用MongoDB进行技术架构优化,同时由10gen公司官方提供强大技术支持。 MongoDB的适用场景 MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。 (1)网站数据:MongoDB非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。 (2)缓存:由于性能很高,MongoDB也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载。 (3)大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。 (4)高伸缩性的场景:MongoDB非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对MapReduce 引擎的内置支持。 (5)用于对象及JSON数据的存储:MongoDB的Bson数据格式非常适合文档化格式的存储及查询。 如有不同观点,欢迎发表评论。如果喜欢我的回答,欢迎"点赞、分享"。