mongodb主要用来干嘛,什么时候用,存什么样的数据?
一年多一直在使用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数据格式非常适合文档化格式的存储及查询。
如有不同观点,欢迎发表评论。如果喜欢我的回答,欢迎"点赞、分享"。
美食的朝圣地长春重庆胡同步行街碎铜烂铁集727摄影撰文亓玉亮长春,每隔一段时间,总会出现让人惊喜的事情。从人民大街步入重庆胡同步行街,当你面对新建的,逶迤成群的六座仿古双柱牌坊,自仿长春老城门的聚宝门开始,在街
为啥你听过很多大道理,却依然过不好这一生?揭开背后扎心真相你有没有想过你该如何过好这一生?我知道,你想过。可问题是要么你虽然想了很久,但还是没有找到答案。要么,虽然你想的很有道理,却依然过不好这一生。想真正琢磨明白这个问题,一共需要两步。
我国上市互联网企业营收规模中高速增长根据中国互联网协会日前发布的中国互联网发展报告2021年中国网络资本发展状况,2021年我国披露的互联网融资案例共2462起,同比增长24,总交易额为483。2亿美元,同比增长13
医疗涨超10!加仓还是减仓?大家好,青春属于稳中求进型的投资者,和大多数普通小伙伴一样,不会轻易梭哈某一个行业,也不会只买入不卖出。我的投资分为短线和长线两部分,短线部分会选择高波动行业,经常会低吸高抛交易相
如何做到产后与宝宝早接触?产后让宝宝和妈妈早接触,早吸吮妈妈乳房可以起到早开奶的作用。最初两周是泌乳建立起来的关键时期。妈妈这两周的辛苦努力,为今后的母乳哺育铺平道路。母乳喂养促进妈妈子宫复旧。早吸吮勤吸吮
22年9月重庆主城区房价排行仅3跌微涨居多一2022年9月重庆主城区房价排行及环比数据第一渝中区均价18361元平方米跌1。70第二江北区均价17567元平方米涨1。13第三渝北区均价16272元平方米涨0。71第四南岸区
农村常见的土人参,农民只知道当野菜,殊不知对痔疮有奇效导语农村随处可见的土人参,农民只知道当野菜,殊不知对痔疮有奇效说起野菜,大家都不会陌生,而且很多人都喜欢吃。过去农民吃野菜是为了充饥,如今农民喜欢吃野菜除了忆苦思甜怀念曾经的岁月,
分享一张补肾固精的方子,守精守汗守正气,改善男言之隐大家好,我是李医生如果说你总感觉身体像是被掏空了一样,并且还伴有头晕气短乏力失眠多梦力不从心等情况,这种情况在中医来看多是因为肾气不固了,为什么这样讲呢?大家要知道,我们的肾有一个
欧冠2比尔森胜利4连胜提前出线马内穆勒破门格雷茨卡双响北京时间10月13日凌晨2点45分,202223赛季欧洲冠军联赛小组赛第4轮,德甲豪门拜仁慕尼黑客场挑战捷克球队比尔森胜利。上半场,马内打破僵局,穆勒扩大比分,格雷茨卡梅开二度下半
G2战队止步小组赛被人嘲讽当初你看不起别人,如今自己也被打脸2022电竞季前言G2战队作为我们LPL联赛的兄弟战队,每年G2战队的比赛都会吸引大量的LPL观众热议,G2战队本次世界赛,也是作为LEC赛区的二号种子的身份进行参加比赛,所以不少
人到中年,最好的状态(都看看)用一个玩笑来形容,成长二字连个偏旁部首都没有,本就孤独。我们都要背上行囊独自走过人生这根独木桥。追逐结果的路上总是会有风有雨,但你要保持风雨无阻的心态,去体验风雨兼程的历练。人生很