mongodb存储什么信息 mongoDB主要使用在什么场景

seosqwseo1周前 (06-17)测评日记8

一、mongodb使用场景是什么

使用场景:

(1)网站数据:MongoDB适合实时的插入,更新与查询,并具备网站实时数据存储所需的**及高度伸缩性。

(2)缓存:由于性能很高,MongoDB也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载。

(3)大尺寸,低价值的数据。

(4)高伸缩性的场景:MongoDB适合由数十或数百台服务器组成的数据库。

(5)用于对象及JSON数据的存储:MongoDB的BSON数据格式适合文档化格式的存储及查询。

mongodb设计特点:

(1)面向**存储,容易存储对象类型的数据。在MongoDB中数据被分组存储在**中,**类似RDBMS中的表,一个**中可以存储无限多的文档。

(2)模式自由,采用无模式结构存储。在MongoDB中**中存储的数据是无模式的文档,采用无模式存储数据是**区别于RDBMS中的表的一个重要特征。

(3)支持完全索引,可以在任意属性上建立索引,包含内部对象。MongoDB的索引和RDBMS的索引基本一样,可以在指定属性、内部对象上创建索引以提高查询的速度。除此之外,MongoDB还提供创建基于地理空间的索引的能力。

(4)支持查询。MongoDB支持丰富的查询*作,MongoDB几乎支持SQL中的大部分查询。

(5)强大的聚合工具。MongoDB除了提供丰富的查询功能外,还提供强大的聚合工具,如count、group等,支持使用MapReduce完成复杂的聚合任务。

二、mongoDB主要使用在什么场景

MongoDB的应用已经渗透到各个领域,比如游戏、物流、电商、内容管理、社交、物联网、视频直播等,以下是几个实际的应用案例:

   ●  游戏场景:使用MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新。

   ●  物流场景:使用MongoDB存储订单信息,订单状态在运送过程中会不断更新,以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。

   ●  社交场景:使用MongoDB存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。

   ●  物联网场景:使用MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。

   ●  视频直播:使用MongoDB存储用户信息、礼物信息等。

三、MongoDB 是什么 能干嘛

近在回顾mongodb的相关知识,输出一篇文章做为MongoDB知识点的总结。

总结的目的在于回顾MongoDB的相关知识点,明确MongoDB在企业级应用中充当的角色,为之后的技术选型提供一个可查阅的信息简报。

MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库

(1)MongoDB提出的是文档、**的概念,使用BSON(类JSON)作为其数据模型结构,其结构是面向对象的而不是二维表,存储一个用户在MongoDB中是这样子的。

使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大增强。

(2)易伸缩,自动故障转移。易伸缩指的是提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器。自动故障转移是副本集的概念,MongoDB能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。

(3)数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如博客系统中能把“评论”直接怼到“文章“的文档中,而不必像myqsl一样创建三张表来描述这样的关系。

SQL类型的数据库是正规化的,可以通过主键或者外键的约束保证数据的完整性与唯一性,所以SQL类型的数据库常用于对数据完整性较高的系统。MongoDB在这一方面是不如SQL类型的数据库,且MongoDB没有固定的Schema,正因为MongoDB少了一些这样的约束条件,可以让数据的存储数据结构更灵活,存储速度更加快。

MongoDB保留了关系型数据库即时查询的能力,保留了索引(底层是基于B tree)的能力。这一点汲取了关系型数据库的优点,相比于同类型的NoSQL redis并没有上述的能力。

MongoDB自身提供了副本集能将数据分布在多台机器上实现冗余,目的是可以提供自动故障转移、扩展读能力。

MongoDB的驱动实现一个写入语义 fire and forget,即通过驱动调用写入时,可以立即得到返回得到成功的结果(即使是报错),这样让写入的速度更加快,当然会有一定的不安全性,完全依赖网络。

MongoDB提供了Journaling日志的概念,实际上像mysql的**n-log日志,当需要插入的时候会先往日志里面写入记录,再完成实际的数据*作,这样如果出现停电,进程突然中断的情况,可以保障数据不会错误,可以通过修复功能读取Journaling日志进行修复。

MongoDB使用分片技术对数据进行扩展,MongoDB能自动分片、自动转移分片里面的数据块,让每一个服务器里面存储的数据都是一样大小。

MongoDB核心服务器主要是通过mongod程序启动的,而且在启动时不需对MongoDB使用的内存进行配置,因为其设计哲学是内存管理好是交给*作系统,缺少内存配置是MongoDB的设计亮点,另外,还可通过mongos路由服务器使用分片功能。

MongoDB的主要客户端是可以交互的js shell通过mongo启动,使用js shell能使用js直接与MongoDB进行交流,像使用sql语句查询mysql数据一样使用js语法查询MongoDB的数据,另外还提供了各种语言的驱动包,方便各种语言的接入。

mongodump和mongorestore,备份和恢复数据库的标准工具。输出BSON格式,迁移数据库。

mongoexport和mongoimport,用来导入导出JSON、CSV和TSV数据,数据需要支持多格式时有用。mongoimport还能用与大数据集的初始导入,但是在导入前顺便还要注意一下,为了能充分利用好mongoDB通常需要对数据模型做一些调整。

mongosniff,网络嗅探工具,用来观察发送到数据库的*作。基本就是把网络上传输的BSON转换为易于人们阅读的shell语句。

因此,可以总结得到,MongoDB结合键值存储和关系数据库的好特性。因为简单,所以数据极快,而且相对容易伸缩还提供复杂查询机制的数据库。MongoDB需要跑在64位的服务器上面,且好单独部署,因为是数据库,所以也需要对其进行热备、冷备处理。

因为本篇文章不是API手册,所有这里对shell的使用也是基础的介绍什么功能可以用什么语句,主要是为了展示使用MongoDB shell的方便性,如果需要知道具体的MongoDB shell语法可以查阅官方文档。

创建数据库并不是必须的*作,数据库与**只有在第一次插入文档时才会被创建,与对数据的动态处理方式是一致的。简化并加速开发过程,而且有利于动态分配命名空间。如果担心数据库或**被意外创建,可以开启严格模式

以上的命令只是简单实例,假设如果你之前没有学习过任何数据库语法,同时开始学sql查询语法和MongoDB查询语法,你会发现哪一个更简单呢?如果你使用的是java驱动去*作MongoDB,你会发现任何的查询都像Hibernate提供出来的查询方式一样,只要构建好一个查询条件对象,便能轻松查询(接下来会给出示例),博主之前熟悉ES6,所以入手MongoDB js shell完成没问题,也正因为这样简洁,完善的查询机制,深深的爱上了MongoDB。

这里引用的是新的驱动包,提供了一套新的访问连接方式

这里只举例了简单的链接与简单的MongoDB*作,可见其*作的容易性。使用驱动时是基于TCP套接字与MongoDB进行通信的,如果查询结果较多,恰好无法全部放进第一服务器中,将会向服务器发送一个getmore指令获取下一批查询结果。

插入数据到服务器时间,不会等待服务器的响应,驱动会假设写入是成功的,实际是使用客户端生成对象id,但是该行为可以通过配置配置,可以通过安全模式开启,安全模式可以校验服务器端插入的错误。

四、mongodb数据库适合做什么

mongodb众所周知不支持事务,所以需要强事务的业务根本不能考虑mongodb。

mongodb的优势就是文档存储:

1.业务经常变动,需要不时的添加字段,那么mongodb比较适合,关系型数据库添加字段的复杂度也还好

2.嵌套文档,业务数据比较复杂,适合嵌套文档式存储,那么mongodb非常合适,这个关系型数据库比较难搞,虽然MySQL和pg也有文档存储,但MySQL的不成熟,pg毕竟现在生产中使用还是偏少,个人也不了解,这里不谈。但这不仅仅这一点优势,具体下面会细说。

3. upsert支持,查询速度也不慢

4.高可用的副本集支持

5.查询语法非常丰富,嵌套文档查询功能非常强大,不是重度用户可能不能理解

下面说说一个具体的使用事例:

项目的一条数据在10kb左右,如果使用关系型数据库那么需要将这条数据拆分成大概几百条左右,建造多个表,设计较复杂,这种数据大概在一百万条左右,想想拆分后在十几亿的数据量就可怕。打平后的数据什么DB也都可以拿下,只是一百万变十几亿比较**而已。

如果采用MySQL存储,每次查询需要使用外键查询多个表,从这些表中拉取数据,性能肯定要下降很多,比不上只在一个表查询,而且只拉取少两个数量级的数据。查询也还好,业务允许可以对结果做缓存,放到redis里去。

但是重点来了,需求要增量更新部分数据,这时候需要更新多个表,根本没法做到原子性(注意事务不是原子*作),当然也可以使用cas等技术补偿,达到终一致性。但使用mongodb存储只需要update一条数据,对相应的嵌套文档中内容更新,可以做到原子性,是不是很方便?

推荐学习《python教程》

具体说说该项目的难点,查询无法使用缓存,可能会很吃惊,但是业务决定了确实做不了,而且增量更新的量达到上万的QPS,如果不能保证原子性想想多么可怕!

所以mongodb在这里帮了大忙,关系型数据库解决不了这个难题。

有人可能要问,mongodb没有事务,上游数据写入也会有问题,你不可能所有数据都存一个表吧?

当然不是的,我们mongodb里的数据是从MySQL中清洗出来存到mongodb中的,mongodb只做单点的业务需求,综合的数据还是在MySQL中。

此项目我们用了上百个副本集,保证系统的高可用,这些副本集配置只要一条shell就搞定,如果用MySQL的主从不知道怎么配(我自己不懂),估计DBA得忙死,而该项目完全不需要也没用到DBA。

说了这么多mongo的优点,也说说他的缺点:

1.查询优化器和MySQL没法比

2.不支持reload,只能冷重启,初始化配置的时候比较麻烦

3.没有事务,不敢存储第一手数据,多用来做备份数据的存储

mongodb可以做很多事情,取决于你脑洞,性能不差,存一些相对不重要的数据,mongodb嵌套文档功能强大,多看看官方文档挖掘挖掘有用信息,每次都能发现惊喜。

相关文章

TCL电视55V8E测评分享

TCL电视55V8E测评分享

很多小伙伴在关注TCL电视55V8E怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

海信电视75英寸4K超清口碑怎么样

海信电视75英寸4K超清口碑怎么样

很多小伙伴在关注海信电视75英寸4K超清怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

Camorama凯眸4K全景运动摄像机车载支架测评怎么样

Camorama凯眸4K全景运动摄像机车载支架测评怎么样

很多小伙伴在关注Camorama凯眸4K全景运动摄像机车载支架怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品...

【年中抢购】正浩快充户外移动电源220V768Wh大容量移动便携自驾露营应急备用储能蓄电池质量好吗

【年中抢购】正浩快充户外移动电源220V768Wh大容量移动便携自驾露营应急备用储能蓄电池质量好吗

很多小伙伴在关注【年中抢购】正浩快充户外移动电源220V768Wh大容量移动便携自驾露营应急备用储能蓄电池怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和...

萤石(EZVIZ)C6c价格多少钱

萤石(EZVIZ)C6c价格多少钱

很多小伙伴在关注萤石(EZVIZ)C6c怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

大疆DJI质量好吗

大疆DJI质量好吗

很多小伙伴在关注大疆DJI怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...