MongoDB入门讲解教学课件_第1页
MongoDB入门讲解教学课件_第2页
MongoDB入门讲解教学课件_第3页
MongoDB入门讲解教学课件_第4页
MongoDB入门讲解教学课件_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

nosql数据库_MongoDB2015-10-021nosql数据库_MongoDB2015-10-021CONTENTS目录1234MongoDB简介MongoDB下载安装MongoDB应用GridFS存取数据机制6789服务器管理MongoDB总结MongoDB与mysql对比复制与分片52CONTENTS目录1234MongoDB简介MongoDB初步了解MongoDB,认识什么是mongoDB,为什么要用MongoDB,MongoDB特性第一节返回3初步了解MongoDB,认识什么是mongoDB,为什么要用MongoDB简介什么是MongoDB?MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。MongoDB的特点?高性能、易部署、易使用,存储数据非常方便4MongoDB简介什么是MongoDB?4MongoDB简介MongoDB主要功能特性?面向集合存储,易存储对象类型的数据。模式自由。支持动态查询。支持完全索引,包含内部对象。支持查询。支持复制和故障恢复。使用高效的二进制数据存储,大型对象(如视频等)。自动处理碎片,以支持云计算层次的扩展性支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。文件存储格式为BSON(一种JSON的扩展)可通过网络访问5MongoDB简介MongoDB主要功能特性?5MongoDB简介使用原理所谓“面向集合”(Collenction-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(BinaryJSON)。6MongoDB简介使用原理6MongoDB简介为什么要用MongoDB?MongoDB的设计是要结合键值存储和关系型数据库的最好特性。键值存储,因为非常简单,所以速度极快而且相对容易伸缩。关系型数据库较难伸缩,至少很难水平伸缩,但拥有富数据模型和强大的查询语言。如果MongoDB能介于两者之间,就能成为一款易伸缩、能存储丰富数据结构、提供复杂查询机制的数据库。在使用场景方面,MongoDB非常适合用做以下应用程序的主要数据存储:Web应用程序、分析与记录应用程序,以及任何要求有中等级别缓存的应用程序。此外,由于它能方便地存储无Schema数据,MongoDB还很适合保存事先无法知晓其数据结构的数据。7MongoDB简介为什么要用MongoDB?7了解如何获得MongoDB软件,包括如何为自己的环境选择正确的版本,如何在Windows和linux中安装和检测运行。第二节返回8了解如何获得MongoDB软件,包括如何为自己的环境选择正确MongoDB下载安装选择正确版本?MongoDB所使用的版本管理相当简单:偶数号为稳定版,奇数号为开发版。注意:32位产品与64位产品之间的区别。32位和64位版本的数据库目前有着相同的功能,唯一的区别是:32位版本将每个服务器的数据集<?????>总大小限制在2GB左右;64位版本没有任何限制,所以在生产环境中应该优先使用64位版本。另外,不同的版本之间也有可能发生变化下载MongoDB?下载地址:/downloads安装MongoDB?在Linux中安装MongoDB,有两种方式:一、通过仓库安装MongoDB;二、手动安装MongoDB在Windows中安装MongoDB,只需要根据自己的需要下载安装包、解压后运行即可。9MongoDB下载安装选择正确版本?9MongoDB下载安装安装解压安装包后在mongodb下建立Data文件夹mongodb\data,然后分别建立db,log两个文件夹,至此mongodb下有以下文件夹mongodb\binmongodb\data\dbmongodb\data\log在log文件夹下创建一个日志文件MongoDB.log,mongodb\data\log\MongoDB.log10MongoDB下载安装安装10MongoDB下载安装启动MongoDB?命令行方式启动:只需按照启动命令来执行就行了。配置文件方式启动:MongoDB也支持同mysql一样的读取启动配置文件的方式来启动数据库Daemon方式启动:启动MongoDB进程的session窗口不小心关闭时,MongoDB进程也将随之停止,MongoDB提供了一种后台Daemon方式启动的选择,只需加上一个”--fork”参数即可停止MongoDB?Control-C:通过Control-C的方式去停止MongoDB实例shutdownServer()指令:通过在admin库中发送db.shutdownServer()指令去停止MongoDB实例Unix系统指令:在找到实例的进程后,可能通过发送kill-2PID或kill-15PID来停止进程11MongoDB下载安装启动MongoDB?11MongoDB下载安装命令启动

进入到bin目录下,输入命令./mongod--dbpath=/usr/local/soft/mongodb/data--logpath=/usr/local/soft/mongodb/logs/MongoDB.log--logappend--auth--port=27017--fork配置文件启动在mongodb下创建mongo.config文件,编辑mongo.config,输入dbpath=D:\mongodb\data\dblogpath=D:\mongodb\log\mongo.log进入bin目录下,输入 mongod--config/mongodb/mongo.config

12MongoDB下载安装命令启动 12MongoDB下载安装停止服务最稳妥的方式,处理完当前所有操作并将缓存的数据保存到磁盘上才停止>useradmin>db.shutdownServer();当然我们也可以直接关闭进程,但这种方式会导致缓存中的数据未急时刷新保存到磁盘上而丢失参数解释:

--dbpath数据库路径(数据文件)--logpath日志文件路径--master指定为主机器--slave指定为从机器--source指定主机器的IP地址--logappend日志文件末尾添加13MongoDB下载安装停止服务13MongoDB下载安装--pologSize指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的oplog大小是空闲磁盘大小的5%)。--port启用端口号--fork在后台运行--only指定只复制哪一个数据库--slavedelay指从复制检测的时间间隔--auth是否需要验证权限登录(用户名和密码)14MongoDB下载安装--pologSize指定日志文本节主要了解怎么运用MongoDB,包括其添加,修改,删除,查询,索引,聚合。本节将会是重点。第三节返回15本节主要了解怎么运用MongoDB,包括其添加,修改,删除,MongoDB应用名称说明db.collection.insert()在集合中创建一个新文档。db.collection.save()提供insert()和update()插入新文件的包装。db.collection.update()修改集合中的文档。db.collection.find()集合上执行查询,并返回一个游标对象。db.collection.findOne()执行查询,并返回一个单独的文档。db.collection.remove()从集合中删除的文件。db.collection.count()换行计数集合或匹配查询中返回的文档数的计数。db.collection.distinct()返回一个数组没有指定的字段不重复值的文件。16MongoDB应用名称说明db.collection.insMongoDB应用添加?添加有两种方式insert()与save()MongoDB是面向文档存储的数据库,文档结构形式叫BSON(类似JSON)db.c1.insert({name:"user1"});db.c1.save({_id:1,name:"user1"});他们两者之间的区别是:1、使用save函数里,如果原来的对象不存在,那他们都插入数据,如果已经存在,save会调用update更新里面的记录,而insert则会忽略操作2、insert可以一次性插入一个列表,而不用遍历,效率高,save则需要遍历列表,一个个插入。具体的看一下函数的源码。17MongoDB应用添加?17MongoDB应用数组操作?$push向文档数组中添加元素,如果没有该数组,则自动添加数组。db.foo.update({},{"$push":{"users":1}})向users数组末尾添加一个1元素db.foo.update({},{"$push":{"users":{“$each”:[1,2]}}})向users数组末尾添加多个元素,要$each配合使用$addToSet可以避免插入重复元素,配合$each使用,可以添加多个不同的值,数组修改器慢,因为文档大小可能会变$pop从头部或尾部删除元素$pull删除满足条件的元素,不止删除一个默认情况下,更新只能对符合匹配条件的第一个文档执行操作,要是多个文档符合条件,只有第一个文档会被更新,其他文档不会发生变化,要更新所有匹配的文档,可以将update的第四个参数设置为truedb.foo.update({},{"$set":{name:'tes'}},false,true)在MongoDB找下级是按点的方式:比如user下有叫logs数组,就user.logs18MongoDB应用数组操作?18MongoDB应用修改?db.collection.update(<query>,<update>,<upsert>,<multi>)修改现有存在的文档或集合时使用。默认的update()方法值更新单个文档。但是如果multi参数设置为true,则更新操作可以更新全部符合条件的文档。Query–类型:文档;用于更新选择过滤。Update–类型:文档;需要更新的文档的内容。Upsert–类型:文档或boolean;设置为true时,当查询没有匹配到文档时进行新建。默认值为falseMulti:-类型:文档或boolean;设置为true时,则更新满足查询条件的所有文档(多个)。设置为false时只更新单个文档。默认为false。19MongoDB应用修改?19MongoDB应用名字说明$inc用来增加已有键的值,或者在键不存在时创建一个键。是专门来增加(和减少)数字的。只能用于整数、长整数或双精度浮点数。$rename重命名字段。新的字段名称不能和文档中现有的字段名相同。$setOnInsert执行insert操作时,操作给相应的字段赋值。$set用来指定一个键的值。如果这个键不存在,则创建它。$unset从文档中移除指定的键。20MongoDB应用名字说明$inc用来增加已有键的值,或者在MongoDB应用删除?db.collection.remove(query,justOne)Query–类型:文档;用于删除选择过滤。JustOne–类型:boolean;当设置为true时只删除一个文档。db.collection.remove({});删除collection中的所有数据,一旦删除不可恢复。但是不会删除collection;db.collection.drop();直接删除collection;去重?Distinct()db.collection.distinct(field,query)Field–类型:字符串;返回非重复的字段。Query–类型:文档;查询条件。db.user.distinct("_id",{age:1})21MongoDB应用删除?21MongoDB应用查询?db.collection.find(<criteria>,<projection>)find()返回的是一个文档集合;db.collection.findOne(<criteria>,<projection>)findOne()返回的是一个文档前一个是查询条件,后一个参数是显示的数据查询操作符(QueryOperators)可以让我们写出复杂查询条件,让我们使用的过程更加灵活。比较查询操作符

$all语法:{field:{$all:[<value>,<value1>...]}field:文档中键的名称(不使用双引号)。

$gt语法:{field:{$gt:value}}匹配键值大于指定值的所有文档。22MongoDB应用查询?22MongoDB应用$gte语法:{field:{$gte:value}}匹配键值不小于指定值的所有文档。$lt语法:{field:{$lt:value}}匹配键值小于指定值的所有文档。$lte语法:{field:{$lte:value}}匹配键值不大于指定值的所有文档。$in语法:{field:{$in:[<value1>,<value2>,...<valueN>]}}匹配键值等于指定数组中任意值的文档。类似sql中in.$nin语法:{field:{$nin:[<value1>,<value2>...<valueN>]}}匹配键不存在或者键值不等于指定数组的任意值的文档。$ne语法:{field:{$ne:value}}匹配键值不等于指定值的文档。逻辑查询操作符$and语法:{$and:[{<expression1>},{<expression2>},...,{<expressionN>}]}and指定一个至少包含两个表达式的数组,选择出满足该数组中所有表达式的文档。and操作符使用短路操作,若第一个表达式的值为“false”,余下的表达式将不会执行。$nor语法:{$nor:[{<expression1>},{<expression2>},...{<expressionN>}]}$nor执行逻辑NOR运算,指定一个至少包含两个表达式的数组,选择出都不满足该数组中所有表达式的文档。$not语法:{field:{$not:{<operator-expression>}}}$not执行逻辑NOT运算,选择出不能匹配表达式的文档,包括没有指定键的文档。$not操作符不能独立使用,必须跟其他操作一起使用(除$regex)。23MongoDB应用$gte语法:{field:{$gtMongoDB应用$or语法:{$or:[{<expression1>},{<expression2>},...,{<expressionN>}]}$or执行逻辑OR运算,指定一个至少包含两个表达式的数组,选择出至少满足数组中一条表达式的文档。元素查询操作符

$exists语法:{field:{$exists:<boolean>}}如果$exists的值为true,选择存在该字段的文档;若值为false则选择不包含该字段的文档。如果该字段的值为null,$exists的值为true会返回该条文档,false则不返回。$mod语法:{field:{$mod:[divisor,remainder]}}匹配字段值对(divisor)取模,值等于(remainder)的文档。$type语法:{field:{$type:<BSONtype>}}选择字段值为指定的BSON数据类型的文档.<BSONtype>使用下面类型对应的编号:24MongoDB应用$or语法:{$or:[{<exMongoDB应用

类型名称编号类型名称编号Double双精度1String字符串2Object对象3Array数组4Binarydata二进制对象5Objectid对象id7Boolean布尔值8Date日期9Null未定义10RegularExpression正则表达式11JavaScriptJavaScript代码13Symbol符号14JavaScriptJavaScript代码(带范围)1532-bitinteger32位整数16Timestamp时间戳1764-bitinteger64位整数18Minkey最小键255Maxkey最大键12725MongoDB应用类型名称编号类型名称编号Double双精MongoDB应用如果文档的键值是一个数组。那么$type将对数组里面的元素进行类型匹配而不是键值数组本身。JavaScript查询操作符$regexregex操作符查询中可以对字符串的执行正则匹配。MongoDB使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式.可以使用正则表达式对象或者regex操作符.db.inventory.find({name:/.4/i});db.inventory.find({name:{$regex:'.4',$options:'i'}});/egger/archive/2013/05/04/3059374.html26MongoDB应用如果文档的键值是一个数组。那么$type将MongoDB应用options(regex提供四个选项标志)i如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。m默认情况下,PCRE认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行).如果目标字符串中没有"\n"字符,或者模式中没有出现“行首”/“行末”字符,设置这个修饰符不产生任何影响。s如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个修饰符,点号不匹配换行符。x如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略,并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。这个修饰符使被编译模式中可以包含注释。注意:这仅用于数据字符。空白字符还是不能在模式的特殊字符序列中出现,比如序列。注:JavaScript只提供了i和m选项,x和s选项必须使用$regex操作符。$where$where操作符功能强大而且灵活,他可以使用任意的JavaScript作为查询的一部分,包含JavaScript表达式的字符串或者JavaScript函数。最典型的应用就是比较文档中的两个键的值是否相等.27MongoDB应用options(regex提供四个选项标MongoDB应用索引?在MongoDB上,索引能提高读操作和查询性能,没有索引,mongoDB必须扫描集合中的每一个文档,然后选择与查询条件匹配的文档。索引的管理<创建索引,删除索引>创建索引命令db.foo.ensureIndex({“x”:1,“y”:-1})使用ensureIndex来创建索引,1为升序,-1为倒序>db.test.ensureIndex({“x”:1},{“unique”:true})上面这条语句是创建唯一索引,创建唯一索引前可能会有重复数据,我们可以使用”dropDups”来鲁莽的删除这些重复数据,写法如下>db.test.ensureIndex({“x”:1},{“unique”:true,“dropDups”:true})28MongoDB应用索引?28MongoDB应用我们可以在创建索引时,为索引起个名字,而不是用系统自动生成的名字,写法如下:db.test.ensureIndex({“x”:1},{“name”:“myindex”})当我们的集合数据量很大的时候,创建索引是一件费时费力的事情,我们可以这些写创建索引的语句,是创建索引的过程在后台完成:db.test.ensureIndex({“x”:1},{“background”:true})删除索引db.test.dropIndex("");29MongoDB应用我们可以在创建索引时,为索引起个名字,而不MongoDB应用聚合函数?count最简单的聚合工具就是count了,它返回document的数量db.foo.count()可以不跟参数也可以跟查询条件distinctdistinct命令返回指定的key的所有不同的值。你必须指定一个collection和一个key。db.runCommand({"distinct":"people","key":"age"})group

{"$group":{"_id":"$author","count":"{"sum":1}"}}sort{"$sort":{"count":-1}}排序,类似于sql中的orderby-1是降序排列,1是正序排列limit分页match用于对文档集合进行筛选30MongoDB应用聚合函数?30了解什么是GridFS,为什么要用GridFS,及其怎么使用GridFS存储文件第四节返回31了解什么是GridFS,为什么要用GridFS,及其怎么使用GridFSGridFS是一种将大型文件存储在MongoDB数据库中的文件规范。所有官方支持的驱动均实现了GridFS规范。为什么要用GridFS?由于MongoDB中BSON对象大小是有限制的,所以GridFS规范提供了一种透明的机制,可以将一个大文件分割成为多个较小的文档,这样的机制允许我们有效的保存大文件对象,特别对于那些巨大的文件,比如视频、高清图片等。如何实现海量存储?为实现这点,该规范指定了一个将文件分块的标准。每个文件都将在文件集合对象中保存一个元数据对象,一个或多个chunk块对象可被组合保存在一个chunk块集合中。大多数情况下,你无需了解此规范中细节,而可将注意力放在各个语言版本的驱动中有关GridFSAPI的部分或是如何使用mongofiles工具上。语言支持?GridFS对Java,Perl,PHP,Python,Ruby等程序语言均支持,且提供了良好的API接口。32GridFSGridFS是一种将大型文件存储在MongoGridFSGridFS使用两个表来存储数据:files包含元数据对象chunks包含其他一些相关信息的二进制块为了使多个GridFS命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀是fs,所以任何默认的GridFS存储将包括命名空间fs.files和fs.chunks。各种第三方语言的驱动有权限改变这个前缀,所以你可以尝试设置另一个GridFS命名空间用于存储照片,它的具体位置为:photos.files和photos.chunks。mongofiles是从命令行操作GridFS的一种工具33GridFSGridFS使用两个表来存储数据:33本节将会详细介绍MongoDB的复制和分片,将会作为重点。第五节返回34本节将会详细介绍MongoDB的复制和分片,将会作为重点。第复制与分片复制:使用复制可以将数据副本保存到多台服务器上,即使一台或者多台服务器出错,也可以保证应用程序正常运行和数据的安全。什么是副本集?副本集是一组服务器,其中一个位主服务器,用于处理客户端的请求,还有很多备份服务器,用于保存主服务器的数据副本,如果主服务器崩溃了,备份服务器会自动将一个成员升级为新的主服务器。在mongoDB中创建一个副本集之后就可以使用复制功能了。使用复制功能时,如果有一台服务器宕机了,仍然可以从副本集的其他服务器上访问数据,如果服务器上的数据损坏或者不可访问,可以从副本集的某个成员中创建一份新的数据副本创建副本集创建副本命令

>replicaSet=newReplSetTest({"nodes":3})>replicaSet.startSet();//启动3个mongod进程>replicaSet.initiate();//配置复制功能35复制与分片复制:35复制与分片在主节点上执行:isMaster()可以查看副本集的状态。isMaster其中有一个很重要的字段指明了这是一个主节点("isMaster":true),副本集还有一个hosts列表备份节点数据可能落后与主节点,可能没有最新写入的数据,所以默认是拒绝访问的。以防止应用程序意外拿到过期的数据。如果在备份节点上做查询,可能得到一个错误提示,说当前节点不是主节点。要想在备份节点读取数据应该输入命令:setSlaveOk();这样就可以读取数据了。不能对备份节点执行写操作。备份节点只能通过复制功能写入数据,不接受客户端的写入请求。客户端在单台服务器上可以执行的请求,都可以发送到主节点执行关闭副本集命令:>replicaSet.stopSet()36复制与分片在主节点上执行:isMaster()可以查看副本集复制与分片配置副本集启动mongoDB服务$mongod--replSetspock-fmongod.conf--fork只有第一个副本集成员拥有数据,其他成员数据目录为空,只要将成员添加到副本集中,会自动克隆第一个成员的数据。刚开始启动服务是他们之间是互不相通的,要想让成员知道彼此,需要创建一个配置文件: >config={"_id":"spock","members":[ {"_id":"0","host":"主机名1"}, {"_id":"1","host":"主机名2"}, {"_id":"2","host":"主机名3"} ]}37复制与分片配置副本集37复制与分片将config对象发送给其中一个副本集成员连接到一个有数据的服务,然后执行命令,初始化副本集>rs.initiate(config)然后这个服务器就会解析配置对象,向其他成员发送消息,所有成员都配置完成之后,他们会自动选出一个主节点,就可以正常处理读写请求了。修改副本集配置>rs.add("服务主机名:端口号");为副本集添加新成员。>rs.remove("服务主机名:端口号")删除副本集中的成员除了添加成员外,其他改变副本集配置的行为时主节点会关闭所有连接,重新配置副本集时,主节点需要先退化为普通节点,以便接受新的配置。重新配置副本集之后,副本集暂时没有主节点,之后就会经过选举产生新的主节点。恢复正常rs.config()查看配置修改是否成功。38复制与分片将config对象发送给其中一个副本集成员38复制与分片分片:是指将用户拆分,将其分散存放在不同机器上的过程,用于处理更大的负载,mongoDB支持自动分片。分片与复制的区别:复制是将数据同步的存在不同服务器上,每个节点的数据都是相同的,而分片每个节点的数据是不相同的,拆分数据。sh.enablesharding();启动分片。sh.shardcollection("colection":{分片依据});进行分片如果查询的时候不使用片键的话,就会将查询发送的每个分片;如果集合存在必须为片键添加索引,如果不添加索引,进行分片的时候会报错,如果集合不存在。mongodb会自动在片键上创建索引。拆分快:达到拆分阀值点进行拆分。39复制与分片分片:是指将用户拆分,将其分散存放在不同机器上的过复制与分片对集合进行拆分时,要选择一个或两个字段用于拆分数据,这个键就叫片键。拆分数据最常用的分发方式有三种:升序片键。类似于date或者是ObjectId随着时间稳定增长的字段。随机分发的片键。可以是用户名,MD5散列值或是数据集中其他一些没有规律的键基于位置的片键,可以是用户的IP,地址,经纬度。片键策略:散列片键流水策略多热点40复制与分片对集合进行拆分时,要选择一个或两个字段用于拆分数据复制与分片何时分片?通常不比太早分片,因为分片不仅会增加部署的操作复杂度,还要求作出设计决策,而该决策以后很难改,另外最好也不要再系统运行太久之后再做分片,在一个过载的系统上不停机进行分片时非常困难的。分片用来:增加可用RAM,增加可用磁盘空间减轻单台服务器的负载处理单个mongod无法承受的吞吐量41复制与分片何时分片?41Mongodb存取数据机制第六节返回42Mongodb存取数据机制第六节返回42Mongodb存取数据机制Collections:在mongodb中叫做集合,是文档的集合。无模式,可以存储各种各样的文档。类似mysql中的表。Document:这里的user集合(“表”)有一个document(document可以理解为mysql中的记录)。文档是mongodb保存数据的基本单元。数据的存储结构为BSON格式,也就是我们开始添加的文档,keyvalue键值对类型。GridFS:因为bson对象的大小有限制,不适合存储大型文件,GridFS文件系统为大型文件提供了存储的方案,GridFS下的fs保存的是图片、视屏等大文件。43Mongodb存取数据机制Collections:在mongMongodb存取数据机制写入:了解了数据结构,就知道了存储机制,MongoDB

的默认数据目录是/data/db,它负责存储所有的MongoDB

的数据文件。在MongoDB内部,每个数据库都包含一个.ns

文件和一些数据文件,而且这些数据文件会随着数据量的增加而变得越来越多。MongoDB

内部有预分配空间的机制,每个预分配的文件都用0

进行填充,由于有了这个机制,

MongoDB

始终保持额外的空间和空余的数据文件,从而有效避免了由于数据暴增而带来的磁盘压力过大的问题。

由于表中数据量的增加,数据文件每新分配一次,它的大小都会是上一个数据文件大小的2倍,每个数据文件最大2G。这样的机制有利于防止较小的数据库浪费过多的磁盘空间,同时又能保证较大的数据库有相应的预留空间使用。

数据库的每张表都对应一个命名空间,每个索引也有对应的命名空间。这些命名空间的元数据都集中在*.ns

文件中。44Mongodb存取数据机制写入:44Mongodb存取数据机制读取:Mongodb可以使用内存映射文件来处理对磁盘文件中数据的读写请求,mongodb并不对磁盘和RAM这两者进行区别对待,只是将文件看做一个巨大的数组,然后按照字节为单位访问其中的数据,剩下的都交由操作系统处理。45Mongodb存取数据机制读取:45权限管理,监控MongoDB,备份第七节返回46权限管理,第七节返回46MongoDB服务器管理使用认证保护服务器?MongoDB支持简单的基于角色的认证系统,通过该系统可以控制用户对数据库的访问以及他们被授予的访问级别。启动的时候指定参数,可以阻止客户端的访问和连接。先启用系统的登录验证模块,只需在启动时指定auth参数即可MongoDB用户角色:Read:允许用户读取指定的数据库。readWrite:授予用户指定数据库的读和写权限。dbAdmin:允许用户在指定的数据库中执行管理函数。userAdmin:允许用户向system.users集合中写入,具有该权限的用户可以在该数据库中创建,删除和管理用户。clusterAdmin:只在admin数据库可使用,为用户赋予所有分片和复制集相关函数的完全管理权限。47MongoDB服务器管理使用认证保护服务器?47MongoDB服务器管理添加删除用户?添加命令:db.addUser("user_reader","user_pwd",true)删除命令:db.system.users.remove({user:"java1"});监控MongoDB?性能监控:mongosniff:此工具可以从底层监控到底有哪些命令发送给了MongoDB去执行。Mongostat:工具可以快速的查看某组运行中的MongoDB实例的统计信息。db.serverStatus:这个命令是最常用也是最基础的查看实例运行状态的命令之一。db.stats:查看数据库状态信息MongoDB从一面世就得到众多开源爱好者和团队的重视,在常用的监控框架如cacti、Nagios、Zabbix等基础上进行扩展,进行MongoDB的监控都是非常方便的48MongoDB服务器管理添加删除用户?48MongoDB服务器管理备份?文件快照方式这是最简单的备份方法。但是,需要系统文件支持快照和mongod必须启用journal。恢复时,确保没有运行mongod,执行快照恢复操作命令,然后启动mongod进程,mongod将重放journal日志。使用mongodump方式千万不要fsyncLock与mongodump配合使用,如果数据库被锁定了,mongodump将永远挂起,使用mongodump备份比较慢,在备份复制集时还有些问题.但是,用来备份单个数据库、集合、子集合还是比较好的方法。复制数据文件方式直接拷贝数据目录下的一切文件。但是在拷贝过程中必须阻止数据文件发生更改。因此需要对数据库加锁,以防止数据写入49MongoDB服务器管理备份?49MongoDB服务器管理备份复制集通常情况下,在secondary进行备份,降低primary负载,只在secondary上锁定,以免影响业务(假设没有发送读请求到secondary)。可以使用上面的任意方式进行备份,不过推荐使用文件快照方式和复制数据文件方式。使用mongodump备份,上面提到了一个问题,那就是在mongodump备份过程中,发生写操作。在复制集架构环境下,要避免这种情况发生,mongodump需要加上--oplog参数,来跟踪备份时服务器上发生的所有操作,获取一个pointin-time快照,否则备份的状态将与集群中其他节点不匹配。在恢复时,还必须创建oplog,并指定--oplogReplay参数来应用这些操作,否则恢复的成员将不知道从何处开始同步,从而在某个时间点上与源服务器保持一致。在备份复制集时,可以设置mongodump连接"setName/s1,s2,s3",它会自动选择一个可用的secondary进行备份。50MongoDB服务器管理备份复制集50MongoDB服务器管理备份分片在分片集群下,不可能在一个时间点上得到一个完整集群状态的快照。当集群越来越大时,从备份恢复整个架构的几率越来越小的。因此,对于分片集群的备份,只需独自备份configserver和复制集。在对分片集群进行备份与恢复操作前,要关闭balancer。对于比较小的分片集群,可以直接从mongos来备份与恢复。在大多数情况下,我们只需要恢复集群中的某个节点。如果需要恢复整个集群,那你够倒霉的了,整个集群数据丢失可能性比较小的。备份时,直接连接分片集群的mongod而不是通过mongos。对于比较小型的分片集群,可以直接通过mongodump连接到mongos进行备份,备份的文件将包含config服务器的元数据信息和实际数据。51MongoDB服务器管理备份分片51对MongoDB的总结。第八节返回52对MongoDB的总结。第八节返回52MongoDB总结Mongodb主要解决的是海量数据的访问效率问题,根据官方的文档,当数据量达到50GB以上的时候,Mongo的数据库访问速度是MySQL的10倍以上。Mongo的并发读写效率不是特别出色,根据官方提供的性能测试表明,大约每秒可以处理0.5万-1.5次读写请求。因为Mongo主要是支持海量数据存储的,所以Mongo还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储,最后由于Mongo可以支持复杂的数据结构,而且带有强大的数据查询功能和类似于sql的索引。Mongodb的高性能在于模式自由,使用高效的二进制数据存储,包括大型对象(如视频等)自动处理碎片,以支持云计算层次的扩展性。在存储海量数据的同时,还有良好的查询性能。当然了mongodb支持多种语言,支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言53MongoDB总结Mongodb主要解决的是海量数据的访问效MongoDB与MySql的对比,从其反映出了nosql数据库与sql数据库的差异。附录返回54MongoDB与MySql的对比,从其反映出了nosql数据MongoDB与MySql对比见文档55MongoDB与MySql对比见文档55nosql数据库_MongoDB2015-10-0256nosql数据库_MongoDB2015-10-021CONTENTS目录1234MongoDB简介MongoDB下载安装MongoDB应用GridFS存取数据机制6789服务器管理MongoDB总结MongoDB与mysql对比复制与分片557CONTENTS目录1234MongoDB简介MongoDB初步了解MongoDB,认识什么是mongoDB,为什么要用MongoDB,MongoDB特性第一节返回58初步了解MongoDB,认识什么是mongoDB,为什么要用MongoDB简介什么是MongoDB?MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。MongoDB的特点?高性能、易部署、易使用,存储数据非常方便59MongoDB简介什么是MongoDB?4MongoDB简介MongoDB主要功能特性?面向集合存储,易存储对象类型的数据。模式自由。支持动态查询。支持完全索引,包含内部对象。支持查询。支持复制和故障恢复。使用高效的二进制数据存储,大型对象(如视频等)。自动处理碎片,以支持云计算层次的扩展性支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。文件存储格式为BSON(一种JSON的扩展)可通过网络访问60MongoDB简介MongoDB主要功能特性?5MongoDB简介使用原理所谓“面向集合”(Collenction-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(BinaryJSON)。61MongoDB简介使用原理6MongoDB简介为什么要用MongoDB?MongoDB的设计是要结合键值存储和关系型数据库的最好特性。键值存储,因为非常简单,所以速度极快而且相对容易伸缩。关系型数据库较难伸缩,至少很难水平伸缩,但拥有富数据模型和强大的查询语言。如果MongoDB能介于两者之间,就能成为一款易伸缩、能存储丰富数据结构、提供复杂查询机制的数据库。在使用场景方面,MongoDB非常适合用做以下应用程序的主要数据存储:Web应用程序、分析与记录应用程序,以及任何要求有中等级别缓存的应用程序。此外,由于它能方便地存储无Schema数据,MongoDB还很适合保存事先无法知晓其数据结构的数据。62MongoDB简介为什么要用MongoDB?7了解如何获得MongoDB软件,包括如何为自己的环境选择正确的版本,如何在Windows和linux中安装和检测运行。第二节返回63了解如何获得MongoDB软件,包括如何为自己的环境选择正确MongoDB下载安装选择正确版本?MongoDB所使用的版本管理相当简单:偶数号为稳定版,奇数号为开发版。注意:32位产品与64位产品之间的区别。32位和64位版本的数据库目前有着相同的功能,唯一的区别是:32位版本将每个服务器的数据集<?????>总大小限制在2GB左右;64位版本没有任何限制,所以在生产环境中应该优先使用64位版本。另外,不同的版本之间也有可能发生变化下载MongoDB?下载地址:/downloads安装MongoDB?在Linux中安装MongoDB,有两种方式:一、通过仓库安装MongoDB;二、手动安装MongoDB在Windows中安装MongoDB,只需要根据自己的需要下载安装包、解压后运行即可。64MongoDB下载安装选择正确版本?9MongoDB下载安装安装解压安装包后在mongodb下建立Data文件夹mongodb\data,然后分别建立db,log两个文件夹,至此mongodb下有以下文件夹mongodb\binmongodb\data\dbmongodb\data\log在log文件夹下创建一个日志文件MongoDB.log,mongodb\data\log\MongoDB.log65MongoDB下载安装安装10MongoDB下载安装启动MongoDB?命令行方式启动:只需按照启动命令来执行就行了。配置文件方式启动:MongoDB也支持同mysql一样的读取启动配置文件的方式来启动数据库Daemon方式启动:启动MongoDB进程的session窗口不小心关闭时,MongoDB进程也将随之停止,MongoDB提供了一种后台Daemon方式启动的选择,只需加上一个”--fork”参数即可停止MongoDB?Control-C:通过Control-C的方式去停止MongoDB实例shutdownServer()指令:通过在admin库中发送db.shutdownServer()指令去停止MongoDB实例Unix系统指令:在找到实例的进程后,可能通过发送kill-2PID或kill-15PID来停止进程66MongoDB下载安装启动MongoDB?11MongoDB下载安装命令启动

进入到bin目录下,输入命令./mongod--dbpath=/usr/local/soft/mongodb/data--logpath=/usr/local/soft/mongodb/logs/MongoDB.log--logappend--auth--port=27017--fork配置文件启动在mongodb下创建mongo.config文件,编辑mongo.config,输入dbpath=D:\mongodb\data\dblogpath=D:\mongodb\log\mongo.log进入bin目录下,输入 mongod--config/mongodb/mongo.config

67MongoDB下载安装命令启动 12MongoDB下载安装停止服务最稳妥的方式,处理完当前所有操作并将缓存的数据保存到磁盘上才停止>useradmin>db.shutdownServer();当然我们也可以直接关闭进程,但这种方式会导致缓存中的数据未急时刷新保存到磁盘上而丢失参数解释:

--dbpath数据库路径(数据文件)--logpath日志文件路径--master指定为主机器--slave指定为从机器--source指定主机器的IP地址--logappend日志文件末尾添加68MongoDB下载安装停止服务13MongoDB下载安装--pologSize指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的oplog大小是空闲磁盘大小的5%)。--port启用端口号--fork在后台运行--only指定只复制哪一个数据库--slavedelay指从复制检测的时间间隔--auth是否需要验证权限登录(用户名和密码)69MongoDB下载安装--pologSize指定日志文本节主要了解怎么运用MongoDB,包括其添加,修改,删除,查询,索引,聚合。本节将会是重点。第三节返回70本节主要了解怎么运用MongoDB,包括其添加,修改,删除,MongoDB应用名称说明db.collection.insert()在集合中创建一个新文档。db.collection.save()提供insert()和update()插入新文件的包装。db.collection.update()修改集合中的文档。db.collection.find()集合上执行查询,并返回一个游标对象。db.collection.findOne()执行查询,并返回一个单独的文档。db.collection.remove()从集合中删除的文件。db.collection.count()换行计数集合或匹配查询中返回的文档数的计数。db.collection.distinct()返回一个数组没有指定的字段不重复值的文件。71MongoDB应用名称说明db.collection.insMongoDB应用添加?添加有两种方式insert()与save()MongoDB是面向文档存储的数据库,文档结构形式叫BSON(类似JSON)db.c1.insert({name:"user1"});db.c1.save({_id:1,name:"user1"});他们两者之间的区别是:1、使用save函数里,如果原来的对象不存在,那他们都插入数据,如果已经存在,save会调用update更新里面的记录,而insert则会忽略操作2、insert可以一次性插入一个列表,而不用遍历,效率高,save则需要遍历列表,一个个插入。具体的看一下函数的源码。72MongoDB应用添加?17MongoDB应用数组操作?$push向文档数组中添加元素,如果没有该数组,则自动添加数组。db.foo.update({},{"$push":{"users":1}})向users数组末尾添加一个1元素db.foo.update({},{"$push":{"users":{“$each”:[1,2]}}})向users数组末尾添加多个元素,要$each配合使用$addToSet可以避免插入重复元素,配合$each使用,可以添加多个不同的值,数组修改器慢,因为文档大小可能会变$pop从头部或尾部删除元素$pull删除满足条件的元素,不止删除一个默认情况下,更新只能对符合匹配条件的第一个文档执行操作,要是多个文档符合条件,只有第一个文档会被更新,其他文档不会发生变化,要更新所有匹配的文档,可以将update的第四个参数设置为truedb.foo.update({},{"$set":{name:'tes'}},false,true)在MongoDB找下级是按点的方式:比如user下有叫logs数组,就user.logs73MongoDB应用数组操作?18MongoDB应用修改?db.collection.update(<query>,<update>,<upsert>,<multi>)修改现有存在的文档或集合时使用。默认的update()方法值更新单个文档。但是如果multi参数设置为true,则更新操作可以更新全部符合条件的文档。Query–类型:文档;用于更新选择过滤。Update–类型:文档;需要更新的文档的内容。Upsert–类型:文档或boolean;设置为true时,当查询没有匹配到文档时进行新建。默认值为falseMulti:-类型:文档或boolean;设置为true时,则更新满足查询条件的所有文档(多个)。设置为false时只更新单个文档。默认为false。74MongoDB应用修改?19MongoDB应用名字说明$inc用来增加已有键的值,或者在键不存在时创建一个键。是专门来增加(和减少)数字的。只能用于整数、长整数或双精度浮点数。$rename重命名字段。新的字段名称不能和文档中现有的字段名相同。$setOnInsert执行insert操作时,操作给相应的字段赋值。$set用来指定一个键的值。如果这个键不存在,则创建它。$unset从文档中移除指定的键。75MongoDB应用名字说明$inc用来增加已有键的值,或者在MongoDB应用删除?db.collection.remove(query,justOne)Query–类型:文档;用于删除选择过滤。JustOne–类型:boolean;当设置为true时只删除一个文档。db.collection.remove({});删除collection中的所有数据,一旦删除不可恢复。但是不会删除collection;db.collection.drop();直接删除collection;去重?Distinct()db.collection.distinct(field,query)Field–类型:字符串;返回非重复的字段。Query–类型:文档;查询条件。db.user.distinct("_id",{age:1})76MongoDB应用删除?21MongoDB应用查询?db.collection.find(<criteria>,<projection>)find()返回的是一个文档集合;db.collection.findOne(<criteria>,<projection>)findOne()返回的是一个文档前一个是查询条件,后一个参数是显示的数据查询操作符(QueryOperators)可以让我们写出复杂查询条件,让我们使用的过程更加灵活。比较查询操作符

$all语法:{field:{$all:[<value>,<value1>...]}field:文档中键的名称(不使用双引号)。

$gt语法:{field:{$gt:value}}匹配键值大于指定值的所有文档。77MongoDB应用查询?22MongoDB应用$gte语法:{field:{$gte:value}}匹配键值不小于指定值的所有文档。$lt语法:{field:{$lt:value}}匹配键值小于指定值的所有文档。$lte语法:{field:{$lte:value}}匹配键值不大于指定值的所有文档。$in语法:{field:{$in:[<value1>,<value2>,...<valueN>]}}匹配键值等于指定数组中任意值的文档。类似sql中in.$nin语法:{field:{$nin:[<value1>,<value2>...<valueN>]}}匹配键不存在或者键值不等于指定数组的任意值的文档。$ne语法:{field:{$ne:value}}匹配键值不等于指定值的文档。逻辑查询操作符$and语法:{$and:[{<expression1>},{<expression2>},...,{<expressionN>}]}and指定一个至少包含两个表达式的数组,选择出满足该数组中所有表达式的文档。and操作符使用短路操作,若第一个表达式的值为“false”,余下的表达式将不会执行。$nor语法:{$nor:[{<expression1>},{<expression2>},...{<expressionN>}]}$nor执行逻辑NOR运算,指定一个至少包含两个表达式的数组,选择出都不满足该数组中所有表达式的文档。$not语法:{field:{$not:{<operator-expression>}}}$not执行逻辑NOT运算,选择出不能匹配表达式的文档,包括没有指定键的文档。$not操作符不能独立使用,必须跟其他操作一起使用(除$regex)。78MongoDB应用$gte语法:{field:{$gtMongoDB应用$or语法:{$or:[{<expression1>},{<expression2>},...,{<expressionN>}]}$or执行逻辑OR运算,指定一个至少包含两个表达式的数组,选择出至少满足数组中一条表达式的文档。元素查询操作符

$exists语法:{field:{$exists:<boolean>}}如果$exists的值为true,选择存在该字段的文档;若值为false则选择不包含该字段的文档。如果该字段的值为null,$exists的值为true会返回该条文档,false则不返回。$mod语法:{field:{$mod:[divisor,remainder]}}匹配字段值对(divisor)取模,值等于(remainder)的文档。$type语法:{field:{$type:<BSONtype>}}选择字段值为指定的BSON数据类型的文档.<BSONtype>使用下面类型对应的编号:79MongoDB应用$or语法:{$or:[{<exMongoDB应用

类型名称编号类型名称编号Double双精度1String字符串2Object对象3Array数组4Binarydata二进制对象5Objectid对象id7Boolean布尔值8Date日期9Null未定义10RegularExpression正则表达式11JavaScriptJavaScript代码13Symbol符号14JavaScriptJavaScript代码(带范围)1532-bitinteger32位整数16Timestamp时间戳1764-bitinteger64位整数18Minkey最小键255Maxkey最大键12780MongoDB应用类型名称编号类型名称编号Double双精MongoDB应用如果文档的键值是一个数组。那么$type将对数组里面的元素进行类型匹配而不是键值数组本身。JavaScript查询操作符$regexregex操作符查询中可以对字符串的执行正则匹配。MongoDB使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式.可以使用正则表达式对象或者regex操作符.db.inventory.find({name:/.4/i});db.inventory.find({name:{$regex:'.4',$options:'i'}});/egger/archive/2013/05/04/3059374.html81MongoDB应用如果文档的键值是一个数组。那么$type将MongoDB应用options(regex提供四个选项标志)i如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。m默认情况下,PCRE认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行).如果目标字符串中没有"\n"字符,或者模式中没有出现“行首”/“行末”字符,设置这个修饰符不产生任何影响。s如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个修饰符,点号不匹配换行符。x如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略,并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。这个修饰符使被编译模式中可以包含注释。注意:这仅用于数据字符。空白字符还是不能在模式的特殊字符序列中出现,比如序列。注:JavaScript只提供了i和m选项,x和s选项必须使用$regex操作符。$where$where操作符功能强大而且灵活,他可以使用任意的JavaScript作为查询的一部分,包含JavaScript表达式的字符串或者JavaScript函数。最典型的应用就是比较文档中的两个键的值是否相等.82MongoDB应用options(regex提供四个选项标MongoDB应用索引?在MongoDB上,索引能提高读操作和查询性能,没有索引,mongoDB必须扫描集合中的每一个文档,然后选择与查询条件匹配的文档。索引的管理<创建索引,删除索引>创建索引命令db.foo.ensureIndex({“x”:1,“y”:-1})使用ensureIndex来创建索引,1为升序,-1为倒序>db.test.ensureIndex({“x”:1},{“unique”:true})上面这条语句是创建唯一索引,创建唯一索引前可能会有重复数据,我们可以使用”dropDups”来鲁莽的删除这些重复数据,写法如下>db.test.ensureIndex({“x”:1},{“unique”:true,“dropDups”:true})83MongoDB应用索引?28MongoDB应用我们可以在创建索引时,为索引起个名字,而不是用系统自动生成的名字,写法如下:db.test.ensureIndex({“x”:1},{“name”:“myindex”})当我们的集合数据量很大的时候,创建索引是一件费时费力的事情,我们可以这些写创建索引的语句,是创建索引的过程在后台完成:db.test.ensureIndex({“x”:1},{“background”:true})删除索引db.test.dropIndex("");84MongoDB应用我们可以在创建索引时,为索引起个名字,而不MongoDB应用聚合函数?count最简单的聚合工具就是count了,它返回document的数量db.foo.count()可以不跟参数也可以跟查询条件distinctdistinct命令返回指定的key的所有不同的值。你必须指定一个collection和一个key。db.runCommand({"distinct":"people","key":"age"})group

{"$group":{"_id":"$author","count":"{"sum":1}"}}sort{"$sort":{"count":-1}}排序,类似于sql中的orderby-1是降序排列,1是正序排列limit分页match用于对文档集合进行筛选85MongoDB应用聚合函数?30了解什么是GridFS,为什么要用GridFS,及其怎么使用GridFS存储文件第四节返回86了解什么是GridFS,为什么要用GridFS,及其怎么使用GridFSGridFS是一种将大型文件存储在MongoDB数据库中的文件规范。所有官方支持的驱动均实现了GridFS规范。为什么要用GridFS?由于MongoDB中BSON对象大小是有限制的,所以GridFS规范提供了一种透明的机制,可以将一个大文件分割成为多个较小的文档,这样的机制允许我们有效的保存大文件对象,特别对于那些巨大的文件,比如视频、高清图片等。如何实现海量存储?为实现这点,该规范指定了一个将文件分块的标准。每个文件都将在文件集合对象中保存一个元数据对象,一个或多个chunk块对象可被组合保存在一个chunk块集合中。大多数情况下,你无需了解此规范中细节,而可将注意力放在各个语言版本的驱动中有关GridFSAPI的部分或是如何使用mongofiles工具上。语言支持?GridFS对Java,Perl,PHP,Python,Ruby等程序语言均支持,且提供了良好的API接口。87GridFSGridFS是一种将大型文件存储在MongoGridFSGridFS使用两个表来存储数据:files包含元数据对象chunks包含其他

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论