MongoDB 4.x概述1、认识MongoDB1.1、面向文档设计1.2、特性1.2.1、完备的索引1.2.2、跨平台支持各种编程语言1.2.3、强大的聚合计算1.2.4、复制、分布式1.3、优势1.3.1、易用性1.3.2、高性能1.3.3、高可靠1.3.4、高可扩展1.3.5、强大的社区支持1.4、需要克服的困难1.4.1、关系型数据库思维的转变1.4.2、事务方面的考量2、类比SQL模型2.1、数据结构2.2、类SQL语句2.2.1、创建表2.2.2、创建索引2.2.3、插入数据2.2.4、查询全表2.2.5、条件查询2.2.6、分页查询2.2.7、更新数据2.2.8、删除数据1、认识MongoDBMongoDB是NoSQL数据库中的佼佼者目前是排名第一的文档型数据库。该数据库基于灵活的JSON文档模型非常适合敏捷式的快速开发。与此同时其与生俱来的高可用、高水平扩展能力使得它在处理海量、高并发的数据应用时颇具优势。1.1、面向文档设计在我们的系统中通常会用分层来描述现实中的模型如图所示。从下往上看每一层都提供了更简单、更容易表述的模型来隐藏下层的复杂性。最为典型的是数据库系统屏蔽了所有磁盘中文件如何存取、压缩/解压缩等细节向应用程序展示了一些通用的数据模型如SQL表、列或是基于JSON、XML的文档模型。而应用程序方面面向对象的模型也已经被绝大多数人所熟知并接受。在处理SQL数据模型时应用程序需要通过代码做一些必要的转换工作一般可以借助一些ORM框架来减少工作量例如Hibernate。然而SQL模型与面向对象之间仍然存在不少差异这些差异并不能完全通过框架屏蔽。相较之下基于JSON的文档模型则更能契合面向对象的设计准则对于开发者来说这在一定程度上降低了使用数据的门槛。MongoDB是基于JSON来描述数据的所有的“数据行”都可以通过一个JSON格式的文档document来表示。比如下面的例子很明显基于JSON格式的数据模型可读性非常强也更加灵活除了基本的数据类型文档中还可以使用数组、内嵌子对象等高级的字段类型。此外JSON还具备无模式模式灵活的特点可以轻松地进行扩展。在访问MongoDB的“表”之前并不需要事先对表模型进行声明尽管你也可以这么做。同时当数据模型发生变更时MongoDB不会强制要求你去执行表结构更新的相关操作这提供了很大的便利性。在MongoDB内部BSON一种二进制版本的JSON扩展被真正用来存储这些JSON形式的文档数据。在JSON的基础之上BSON进行了一些易用性方面的扩展例如增加日期、二进制等类型的支持。虽然MongoDB“沿袭”了JSON的特点但将它归类为无模式数据库是不恰当的。实际上所有的读写都是基于一种内部隐含的模式模式采取按需变更而非提前声明因此动态模式一词更适合它。1.2、特性1.2.1、完备的索引与大多数数据库一样MongoDB支持各种丰富的索引类型包括单键索引、复合索引唯一索引等一些常用的结构。由于采用了灵活可变的文档类型因此它也同样支持对嵌套字段、数组进行索引。通过建立合适的索引我们可以极大地提升数据的检索速度。值得一提的是MongoDB的索引实现与一般的关系型数据库索引并没有太多不同因此我们几乎可以使用某种“一致的思路”来设计索引或完成一些性能调优的任务。在一些特殊应用场景MongoDB还支持地理空间索引、文本检索索引、TTL索引等不同的特性这些特性在很大程度上简化了应用程序的开发工作同时也使MongoDB获得了大量使用者的青睐。1.2.2、跨平台支持各种编程语言MongoDB是用C语言编写的其官方网站提供了各种平台的编译版本你可以在Windows或几乎任意一个Linux发行版本中安装及运行MongoDB数据库。以X86_64体系为例MongoDB支持的操作系统如图所示。需要注意的是在MongoDB 3.4以后不再支持32-bitX86体系但这点的影响很小作为一款通用的后端数据库来说使用64位的计算架构是必然的选择。在客户端方面MongoDB提供了多种编程语言实现的驱动程序除了Java、C/C/C等传统语言像Python、NodeJS等动态语言也都有对应的实现。1.2.3、强大的聚合计算聚合aggregation计算是MongoDB面向数据分析领域的重要特性可以用于实现数据的分类统计或一些管道计算。作为对照聚合框架能轻松完成关系型数据库的groupby语句的分组功能又或是大数据领域的map-reduce计算。可能存在的一点区别就是MongoDB聚合框架是以文档化模型为基础来设计的更适合非结构化数据。MongoDB为聚合框架提供了大量常用的函数以简化开发除此之外聚合框架还用到了一种叫“管道”pipeline的概念用于抽象各个数据处理的阶段一个管道由多个“阶段”stage组成通过对不同的阶段进行自由组合我们就可以灵活应对各种场景中的计算需求。1.2.4、复制、分布式MongoDB通过副本集replication set来实现数据库的高可用这点类似于MySQL的Master/Slave复制架构不同的是一个副本集可以由一个主节点和多个备节点组成主节点和备节点基于oplog来实现数据同步。在主节点发生故障时备节点将重新选举出新的主节点以继续提供服务整个切换过程是自动完成的。在海量数据处理方面MongoDB原生就支持分布式计算能力。在一个分布式集群中多个文档被划入一个逻辑数据块chunk这些数据块可以被存储于不同的计算节点分片上在新的计算节点分片加入时数据块可以借助自动均衡的算法机制被迁移到合适的位置通常是压力较小的分片。通过这种自动化的调度及均衡工作整个集群的数据库读写压力可以被分摊到多个节点上从而实现负载均衡和水平扩展。1.3、优势1.3.1、易用性简单易用是MongoDB的一大优势。MongoDB是基于JSON格式的这点对于开发人员来说显然更加友好尤其是对全栈式开发者来说JSON是前后端开发领域中最通用、易读的描述性语言。如果你是一名新手则只需要了解一点JavaScript的语法就可以基本掌握一种数据库的使用这听起来非常振奋人心。另外一点则是无模式带来的便利由于没有了强制的表定义约束在文档结构发生变化时并不需要如关系型数据库一样事先执行一些DDL变更语句这非常有利于业务的平滑升级。因此MongoDB的开发效率更高更适合敏捷开发。1.3.2、高性能从MongoDB 3.0版本开始引入WiredTiger存储引擎在性能及稳定性上都有了明显的提升。WiredTiger存储引擎在数据检索性能上做了许多优化基于内存的二级的缓存提供了高速读取数据能力在写方面则是根据磁盘I/O的特点做了缓冲式写入这是基于空间、时间因素权衡的一种择优设计。从大量的测评结果来看其性能表现是令人满意的。1.3.3、高可靠对于单个MongoDB节点来说可以通过开启Journal机制来实现断电保护这是一种WAL预写日志机制在发生异常断电后可以通过Journal日志进行数据恢复。在默认情况下Journal仅允许最多丢失50ms内更新的数据。对于集群节点来说MongoDB则提供了副本集架构来支持数据库的高可用在节点发生宕机时可以实现秒级的切换这个过程对于应用是透明的。1.3.4、高可扩展在分片的集群架构中数据的读写会均衡地分布在多个数据库节点上通过增加分片的方式就可以实现按需扩展。在数据业务持续增长时借助分片集群可以轻松支撑海量的数据存取。1.3.5、强大的社区支持MongoDB有着庞大的使用群体在一定程度上巩固了它在NoSQL领域的领先地位。也因为该数据库是如此流行国内外各大云计算厂商基本都提供了MongoDB协议兼容的数据库服务见下表。由此可见该数据库的使用前景是非常广阔的随着新版本中一些重要功能的补齐比如事务它所适用的场景将越来越多。1.4、需要克服的困难正如前面所说MongoDB非常容易使用但一些企业在初次选择MongoDB之后可能会存在“水土不服”的问题具体如下。1.4.1、关系型数据库思维的转变如果团队长期使用关系型数据库那么团队成员可能已经习惯于使用各种复杂连接join、多重嵌套子查询等SQL用法。MongoDB在这方面的支持较弱尽管可以通过聚合操作实现类似的效果但这并非最佳实践。在从关系型数据库迁移到MongoDB之后你需要从思维上产生一些转变。尽可能让数据库设计变得简单、适用将关注点放在系统未来的扩展能力上做好表设计、访问模式及性能的权衡。1.4.2、事务方面的考量在MongoDB 4.0版本之后开始支持事务功能这意味着在一些对一致性要求非常高的场景中比如金融交易类产品也可以使用MongoDB了。利用数据库本身的事务性保证还可以实现分布式事务这对于提升系统的可伸缩性有明显的效果。2、类比SQL模型2.1、数据结构如果你已经熟知关系型数据库RDBMS的概念模型那么不难理解database、table、row、column这几个基本概念。MongoDB使用的数据模型与它们非常类似见下表。说明如下数据库database最外层的概念可以理解为逻辑上的名称空间一个数据库包含多个不同名称的集合。集合collection相当于SQL中的表一个集合可以存放多个不同的文档。文档document一个文档相当于数据表中的一行由多个不同的字段组成。字段field文档中的一个属性等同于列column。索引index独立的检索式数据结构与SQL概念一致。_id每个文档中都拥有一个唯一的_id字段相当于SQL中的主键primary key。视图view可以看作一种虚拟的非真实存在的集合与SQL中的视图类似。从MongoDB 3.4版本开始提供了视图功能其通过聚合管道技术实现。聚合操作$lookupMongoDB用于实现“类似”表连接table join的聚合操作符。尽管这些概念大多与SQL标准定义类似但MongoDB与传统RDBMS仍然存在不少差异包括半结构化在一个集合中文档所拥有的字段并不需要是相同的而且也不需要对所用的字段进行声明。因此MongoDB具有很明显的半结构化特点。除了松散的表结构文档还可以支持多级的嵌套、数组等灵活的数据类型非常契合面向对象的编程模型。弱关系MongoDB没有外键的约束也没有非常强大的表连接能力。类似的功能需要使用聚合管道技术来弥补。2.2、类SQL语句既然MongoDB视一切为文档那么自然也包括数据操作的命令。所有的增加、删除、修改、查询命令都通过JSON文档进行描述。值得庆幸的是如果你已经熟知标准的SQL语法ANSI SQL那么在转换到MongoDB这种文档式命令风格时或许会觉得很自然。其中原因就在于SQL本身也是一种结构化的表达语言例如一个select查询语句的基本组成包括select子句表示查询什么内容。from子句表示从哪里查。where子句表示按什么条件过滤。MongoDB的查询命令几乎有着一模一样的语义可以说MongoDB的指令实质上也是一种类SQL语义的实现。接下来通过一组对比来快速了解MongoDB的命令风格。2.2.1、创建表SQL语句如下createtablepeople(idmediumintnotnullauto_increment,user_idvarchar(30),age number,statuschar(1),primarykey(id));类似的MongoDB命令如下db.people.insertOne({user_id:abc123,age:55,status:a})MongoDB在首次写入文档时会自动创建集合。2.2.2、创建索引SQL语句如下createindexidx_user_id_asc_age_desconpeople(user_id,agedesc)类似的MongoDB命令如下db.people.createIndex({user_id:1,age:-1})2.2.3、插入数据SQL语句如下insertintopeople(user_id,age,status)values(bcd001,45,a);类似的MongoDB命令如下db.people.insertOne({user_id:bcd001,age:45,status:a})2.2.4、查询全表SQL语句如下select*frompeople;类似的MongoDB命令如下db.people.find()2.2.5、条件查询SQL语句如下selectuser_id,statusfrompeoplewherestatusa;类似的MongoDB命令如下db.people.find({status:a},{user_id:1,status:1,_id:0})2.2.6、分页查询SQL语句如下select*frompeoplelimit5skip10;类似的MongoDB命令如下db.people.find().limit(5).skip(10)2.2.7、更新数据SQL语句如下updatepeoplesetstatuscwhereage25;类似的MongoDB命令如下db.people.updateMany({age:{$gt:25}},{$set:{status:c}})2.2.8、删除数据SQL语句如下deletefrompeoplewherestatusd;类似的MongoDB命令如下db.people.deleteMany({status:d})
郑州网站建设
网页设计
企业官网