玩转 MongoDB 从入门到实战.pdf
《玩转 MongoDB 从入门到实战.pdf》由会员分享,可在线阅读,更多相关《玩转 MongoDB 从入门到实战.pdf(37页珍藏版)》请在文库网上搜索。
1、玩转 MongoDB 从入门到实战12玩转 MongoDB 从入门到实战序言阿里云智能资深技术专家阿里云 NoSQL 数据库负责人杨成虎(叶翔)2016 年开始大量的用户反馈希望阿里云能提供 MongoDB 云服务。同年,MongoDB 正式发布了 3.2 版本,存储引擎重构到 WiredTiger 之上。其稳定性,功能性相比以往的版本都有了大幅度的提升。我和同事们经过一番调研,确定时机成熟,随即敲定了将 MongoDB 放到阿里云上,作为一方阿里云产品提供商业服务,并且成立了相应的 MongoDB 研发团队。在整个产品的上线研发过程中,对 MongoDB 的学习愈加深入,就愈加的喜爱它。其灵
2、活的JSON 数据处理,弹性的 Sharding,高可靠的 ReplicaSet 等能力可以极大的简化业务系统复杂度,提升研发效率,不愧于“程序员最喜爱的数据库”称号。而运行于云之上的 MongoDB,被赋予了生命周期管理,自动备份管理等云原生的企业级能力。阿里云与 MongoDB,云原生与开源数据库的姻缘就此开启。2019 年,阿里云与 MongoDB 达成战略合作,作为云厂商独家支持 MongoDB 4.0 以及后续最新版本的服务,与 MongoDB 的关系从开源社区到商业合作全面覆盖。同年,MongoDB 4.2 版本发布,具备了分布式事务的处理能力,覆盖传统关系型数据库的事务能力。近期
3、,阿里云 MongoDB的云原生技术也从生命周期的托管逐步升级到资源池化与存储计算分离的云原生架构。利用云原生技术架构,让传统数据库具备了系统资源灵活弹性升级的云化能力,帮助用户便捷的实现数字化转型升级,降低企业 TCO 成本。但是我们也发现,中文的 MongoDB 学习资料并不多。国内很多的用户对 MongoDB 的使用也常有一些误解,例如错误的认为数据库会丢失,且不可靠。也并不清楚 MongoDB 现已具备了强大的事务处理能力。在市场中急需这样的一本书帮助大家更深入的学习 MongoDB,在生产系统中更好的使用它,为业务赋予更高的价值。本次书籍的编写者,有来自阿里云的研发工程师,也有 Mo
4、ngoDB公司的原厂架构师,还有来自社区的支持者。合众人之力完成了本次书籍编写,也感谢阿里云的开发者社区,使本书得以顺利出版。欢迎广大读者能加入到开源社区,源于开源、回馈开源。34玩转 MongoDB 从入门到实战走进 MongoDB 05目录MongoDB 聚合框架 11复制集使用及原理介绍 16分片集群使用及原理介绍 25ChangeStreams 使用及原理 34事务功能使用及原理介绍 47MongoDB 最佳实践一 56MongoDB 最佳实践二 63微信关注公众号:阿里云数据库第一时间,获取更多技术干货阿里云开发者“藏经阁”海量免费电子书下载56玩转 MongoDB 从入门到实战走进
5、 MongoDB定位上,MongoDB 介于 Memcached 和关系型数据库之间,扩展性和性能上,MongoDB 更接近于 Memcached,功能上,MongoDB 更接近于关系型数据库。在生产环境中,MongoDB 经常会部署成一个三节点的复制集,或者一个分片集群。我们先来看左边。当 MongoDB 部署为一个复制集时,应用程序通过驱动,直接请求复制集中的主节点,完成读写操作。另外两个从节点,会自动和主节点同步,保持数据的更新。在集群运行的过程中,万一主节点遇到故障,两个从节点会在几秒的时间内选举出新的主节点,继续支持应用的读写操作。我们再来看右边,当 MongoDB 被部署为一个分片
6、集群时,应用程序通过驱动,访问路由节点,也就是 Mongos 节点 Mongos 节点会根据读写操作中的片键值,把读写操作分发的特定的分片执行,然后把分片的执行结果合并,返回给应用程序。那集群中的数据是如何分布的呢?这些元数据记录在 Config Server 中,这也是一个高可用的复制集。每个分片管理集群中整体数据的一部分,也是一个高可用复制集。此外,路由节点,也就是 Mongos 节点在生产环境通常部署多个。这样,整个分片集群没有任何单点故障。(二)MongoDB 基本概念与关系数据的对应关系关系型数据通常有数据库和表的概念,对应在 MongoDB 里有数据库和集合关系;数据库有主表和子表
7、,对应 MongoDB 通常使用内嵌的子文档或内嵌数组;关系型数据里有 Index 索引,MongoDB 也有类似概念;关系数据库里一条数据称为一行,MongoDB 称为一个文档 Document;关系型数据库里面的列,对应到 MongoDB 成为一个字段 Field;关系数据库里面经常使用 Join 连接操作,对应 MongoDB 通常使用内嵌方式解决,如果使用Linking 方式,对应使用$Lookup 操作符也可支持左外链接;关系型数据库里面还有视图,对应 MongoDB 也有只读视图和按需物化视图;关系型数据库里面会有 ACID 的多记录事务,对应的 MongoDB 里面会有 ACID
8、 的多文档事务。(三)MongoDB 的数据层次结构 MongoDB 里面数据主要分为三层,文档(Documents),集合(Collections),和数据库(Databases),多个文档是存储在一个集合中,多个集合存放在一个数据库里,每个集群里面可能会有多个数据库。例如:数据库(Database):Products集合(Collections):Books,Movies,Music一、MongoDB 的相关概念作者|张春立Depth of FunctionalityScalability&PerformanceMemcachedMongoDBRDBMSMongoDB 的功能定位Repli
9、ca SetReadWriteApplicationApplicationMongoDMongoDMongoDShard ClusterReadWriteApplicationDriverMongoSConfigServersShard(replica set)MongoDB 部署模型(一)MongoDB 部署模型RDBMSMongDBMongoDB 基本概念与关系数据的对应关系DatabaseDatabaseTableCollectionParent-Child TablesNested Sub-Documentor ArrayIndexIndexRowDocumentColumnFieid
10、JoinEmbeddingLinking,SlookupViewRead-OnlyViewOn-DemandMaterializedViewMulti-RecordACIDTransactionMulti-DocumentACIDTransaction78玩转 MongoDB 从入门到实战运行 MongoDB/bin/mongod-dbpath/data/dbMongoDB 安装的 bin 目录 MongoDB 数据文件的位置数据库和集合的组合,构成 MongoDB 的命名空间:Products.BooksProducts.MoviesProducts.Music*数据库名最长不能超过 64
11、个字节,命名空间最长不能超过 120 字节*FCV=4.4,命名空间长度限制为 255 字节(四)MongoDB 的数据结构MongoDB 采用 JSON 文档结构:JSON 的全称:JavaScript Object NotationJSON 的格式:支持如下数据格式字符串:e.g.,“Thomas”数字:e.g.,29,3.7)布尔:True/false空值:Null数组:e.g.,88.5,91.3,67.1对象:Object安装你的第一个 MongoDB 系统第一个命令:下载第二个命令:解压第三个命令:改个目录名访问 MongoDB创建复制集练习1.创建数据目录:3.连接 MongoD
12、B 服务:4.指定复制集配置2.启动三个 MongoDB 服务创建分片集群练习有以下 5 个步骤:1.创建 Config Server 复制集2.创建一个或多个分片(每个分片为一个复制集)3.启动 Mongos(一个或多个)4.访问 Mongos,把分片添加到集群5.选择片键,启用分片以上就完成整个分片集群的部署。生产环境部署建议生产环境当中,大家应该遵循生产环境部署的一些最佳实践。比如:1.容量规划:计算资源,存储容量,IOPS,Oplog,网络带宽2.高可用:部署复制集或分片集群3.节点个数:复制集部署奇数个节点,避免脑裂4.应用生产环境的最佳实践,如:使用主机名而不是 IP文件系统(Li
13、nux 环境推荐 XFS)禁用 NUMA禁用 THP调高资源限制SwappinessReadaheadTcp_Keepalive_Time时钟同步安全配置上图是 MongoDB 数据类型的一些列表,常见类型 MongoDB 几乎都支持。(五)MongoDB 采用 BSON 格式保存数据firstName:Thomas,lastName:Smith,age:29二、集群部署MongoDB 数据类型TypeNumberAliasDouble1“double”String2“string”Object3“object”Array4“array”Binary data5“binData”Undefin
14、ed6“undefined”Objectld7“objectld”Boolean8“bool”Date9“date”TypeNumberAliasDouble1“double”String2“string”Object3“object”Array4“array”Binary data5“binData”Undefined6“undefined”Objectld7“objectld”Boolean8“bool”Date9“date”Null10“null”DBPointer12“dbPointer”JavaScript13“javascript”Regular Expression11“rege
15、x”Symbol14“symbol”JavaScript(with scope)15“javascriptWithScope”32-bit integer16“int”Timestamp17“timestamp”64-bit integer18“long”Decimal12819“deciml”Min key-1“minKey”Max key127“maxKey”插入新文档insertOnedb.products.insertOne(item:card,qty:15 );insertManydb.products.insertMany(_id:10,item:large box,qty:20,
16、_id:11,item:small三、基本操作curl-O https:/fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.2.tgz$./bin/mongo MongoDB 安装的 bin 目录 MongoDB shell version:4.4.2.Server has startup warnings:2020-12-15T04:23:25.268+0000 I CONTROL initandlisten2020-12-15T04:23:25.268+0000 I CONTROL initandlisten*WARNING:
17、Access control is not enabled for the database.mkdir rs1 rs2 rs3mongo/connect to the default port 27017rs.initiate()/初始复制集rs.add(:27018)/增加一个节点配置rs.add(:27019)/增加一个节点配置rs.status()mongod-replSet rs-dbpath./rs1-port 27017-fork-logpath./rs1/mongod.logmongod-replSet rs-dbpath./rs2-port 27018-fork-logpat
18、h./rs2/mongod.logmongod-replSet rs-dbpath./rs3-port 27019-fork-logpath./rs3/mongod.logtar xzvf mongodb-linux-x86_64-rhel70-4.4.2.tgzmv mongodb-linux-x86_64-rhel70-4.4.2 mongodb第四个命令:没了!910玩转 MongoDB 从入门到实战删除文档删除集合和数据库使用 Drop 删除集合使用 DB.Drop()来删除一个集合集合中的全部文档都会被删除.集合相关的索引也会被删除更新操作Update 操作需要执行参数参数包括查询参
19、数更新参数Update 更新数组操作$Push:增加一个对象到数组底部$PushAll:增加多个对象到数组底部.$Pop:从数组底部删除一个对象$Pull:如果匹配指定的值或条件,从数组中删除相应的对象.$PullAll:如果匹配列表中的任意值,从数组中删除相应的对象.$PullAll:如果匹配列表中的任意值,从数组中删除相应的对象$AddToSet:如果不存在则增加一个值到数组使用 Upsert:True 更新或插入如果希望没有就添加,指定 Upsert:True 参数默认情况下如果没有匹配的对象,就不会执行更新使用 Find 查询数据文档使用 Find 查询数据文档Find 是 Mongo
20、DB 的基础查询命令Find 返回数据的游标(Cursor)Find 是 MongoDB 的基础查询命令Find 返回数据的游标(Cursor)SQL 查询条件对照查询操作符使用 DropDatabase 删除数据库使用 DB.dropDatabase()来删除数据库数据库相应文件也会被删除,磁盘空间将被释放deleteOnedb.orders.deleteOne(_id:ObjectId(563237a41a4d68582c2509da);db.orders.deleteOne(expirationTime:$lt:ISODate(2015-11-01T12:40:15Z);deleteMa
21、nydb.orders.deleteMany(client:Crude Traders Inc.);removedb.collection.remove(,)db.colToBeDropped.drop()use tempDBdb.dropDatabase()show collections/No collectionsshow dbs/The db is gonedb.movies.find(year:1975 )/单条件查询db.movies.find(year:1989,title:Batman )/多条件 and 查询db.movies.find($or:year:1989,title
22、:Batman )/多条件 or 查询db.movies.find($and:title:Batman,category:action )/and 查询db.movies.find(title:/B/)/按正则表达式查找db.movies.find(year:1975 )/单条件查询db.movies.find(year:1989,title:Batman )/多条件 and 查询db.movies.find($or:year:1989,title:Batman )/多条件 or 查询db.movies.find($and:title:Batman,category:action )/and
23、查询db.movies.find(title:/B/)/按正则表达式查找a=1-a:1a 1-a:$ne:1a 1-a:$gt:1a=1-a:$gte:1a a:$lt:1a a:$lte:1a=1 AND b=1-a:1,b:1或$and:a:1,b:1a=1 OR b=1-$or:a:1,b:1a IS NULL-a:$exists:falsea IN(1,2,3)-a:$in:1,2,3$lt:存在并小于$lte:存在并小于等于$gt:存在并大于$gte:存在并大于等于$ne:不存在或存在但不等于$in:存在并在指定数组中$nin:不存在或不在指定数组中$or:匹配两个或多个条件中的一个
24、$and:匹配全部条件db.movies.update(title:Jaws,$inc:budget:5 ,upsert:true )“_id”:ObjectId(5847f65f83432667e51e5ea8),title:Jaws,budget:5/insert datadb.movies.insert(title:Batman,category:action,adventure,imdb_rating:7.6,budget:35,title:Godzilla,category:action,adventure,sci-fi,imdb_rating:6.6,title:Home Alon
25、e,category:family,comedy,imdb_rating:7.4)db.movies.update(title:Batman,$set:imdb_rating:7.7 )查询蝙蝠侠更新 IMDB 评分字段如果找不到“大白鲨”就增加一个“大白鲨”电影box,qty:55,_id:12,item:medium box,qty:30 );Insertdb.collection.insert(,writeConcern:,ordered:)1112玩转 MongoDB 从入门到实战Type$project$group$eq/$gt/$gte/$lt/$lte$and$or$not$in
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 玩转 MongoDB 从入门到实战 入门 实战