240 likes | 371 Views
第一篇:认识MongoDB. MongoDB是一个高性能、开源、 无模式 的文档类型数据库,使用C++开发,主要解决的是海量数据的访问效率问题。 优点: 根据文档记载,当数据量达到50GB以上的时候,MongodDB的数据库访问速度是Mysql的10倍以上。 缺点: 并发读写效率不是特别出色,根据官方提供的性能测试,大约0.5W ~ 1.5W/s次读写请求。(注意:关系数据库如mysql,如果空库也许并发还OK,如果数据量积累越来越大,那么并发及相关索引生成等会遇到非常大瓶颈,而非关系数据库则不存在这种问题)
E N D
第一篇:认识MongoDB MongoDB是一个高性能、开源、无模式的文档类型数据库,使用C++开发,主要解决的是海量数据的访问效率问题。 优点:根据文档记载,当数据量达到50GB以上的时候,MongodDB的数据库访问速度是Mysql的10倍以上。缺点:并发读写效率不是特别出色,根据官方提供的性能测试,大约0.5W ~ 1.5W/s次读写请求。(注意:关系数据库如mysql,如果空库也许并发还OK,如果数据量积累越来越大,那么并发及相关索引生成等会遇到非常大瓶颈,而非关系数据库则不存在这种问题) ------- liuxinming
什么是MongoDB • 介于关系数据库和非关系数据库之间 • 是非关系数据库当中功能最丰富的一个 • 支持类似JSON的BSON格式
为什么要使用MongoDB 随着现在WEB及移动互联网对大数据操作的要求,非关系型的数据库是基于解决这样问题而诞生的。关系数据库在应用中暴露了以下几个难以克服的问题(Mysql) • 对数据库高并发读写的需求 • 对海量数据的高效率存储和访问的需求 • 对数据库的高可扩展性和高可用性的需求
MongoDB使用原理 • 面向集合(Collection-Oriented):数据被分组存储在数据集中,称为一个集合,每个集合在数据库中都有一个唯一标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库里的表(table)。不同的是它不需要定义任何模式(schema) • 模式自由(Schema-Free):对于存储在MongoDB中的文件,不需要知道它的任何结构定义。多次提到的无模式或模式自由具体是什么?例如,下面两条记录可以存在同一个集合里面。{"company","联云科技"}{"area","西安,杭州"}通俗点:就是不需要预先定义存储字段,每个文档结构可以是不一样的,在mysql中每张表模式是固定的,存储的字段也往往比较受限,而mongodb模式比较自由 • 文档型存储的数据是键值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档。这个格式称为BSON(Binary Serialized dOcument Notation)
MongoDB特点 • 面向集合存储,易于存储对象类型的数据。 • 模式自由 • 支持动态查询 • 支持完全索引,包含内部对象 • 支持查询 • 支持复制(主存概念)和故障恢复 • 使用高效二进制数据存储 • 自动处理碎片 • 支持Python,PHP,Ruby,Java,C,C#,JavaScript,Perl及C++语言的驱动程序
MongoDB功能 • 面向集合存储,是和存储对象及JSON形式的数据。 • 动态查询,MongoDB支持丰富的查询表达式。查询指令使用JSON形式的标记 • 完整的索引支持 • 复制及自动故障转移:支持服务器之间的数据复制,支持主存模式及服务器之间的互相复制。复制主要目的是自动故障转移。 • 适合场景:1、网站数据2、缓存3、大尺寸、低价值的数据
MongoDB应用实际案例 • 淘宝网 • 大众点评 • 视觉中国网站视觉中国NoSql之路文章:http://blog.nosqlfan.com/html/1155.htmlhttp://www.infoq.com/cn/interviews/pf-mongodb-develop
MongoDB-windows安装 • 步骤一: 下载MongoDB url下载地址: http://www.mongodb.org/downloads • 步骤二: 设置MongoDB程序存放程序存放目录目录 将其解压到 对应的目录我本地是E:\pdenv\mongodb\ • 步骤三:设置MongoDB数据文档存储目录 • 步骤四:启动MongoDB服务进入 cmd 提示符控制台,E:\pdenv\mongodb\bin\mongod.exe --dbpath=E:\pdenv\data\mongodbMongoDB服务端的默认监听端口是 27017 • 步骤五:客户端连接验证输入:mongo
MongoDB数据逻辑结构 • MongoDB的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的,用户使用MongoDB开发应用程序使用的就是逻辑结构。 • MongoDB的文档(document),相当于关系数据库中的一行记录 • 多个文档组成一个集合(collection),相当于关系数据库的表 • 多个集合(collection),逻辑上组织在一起,就是数据库(database) • 一个MongoDB实例支持多个数据库 • 结构图如下:
启动MongoDB数据库 MongoDB安装、配置完后,必须先启动,然后才能使用。 1、命令行方式启动E:\pdenv\mongodb\bin\mongod.exe --dbpath=E:\pdenv\data\mongodb 只需要指定dbpath参数即可。 2、配置文件方式启动 3、Daemon方式启动
mongod参数说明 • dbpath:数据文件存放路径,每个数据库会在其中创建一个子目录,拥有防止同一个实例多次运行的mongodb.lock也保存在此目录 • logpath:错误日志文件 • logappend:错误日志采用追加模式(默认是覆写模式) • bind_ip:对外服务器的绑定ip,一般设置为空,及绑定在本机所有可用ip上,如有需要可以单独指定IP • port:对外服务端口。Web管理端口在这个port的基础上+1000 • fork:以后台Daemon形式运行服务 • journal:开启日志功能,通过保存日志来降低单机故障的恢复时间 • syncdelay:系统同步刷新磁盘的时间,单位为秒,默认60s • directoryperdb:每个db存放在单独的目录中,建议设置该参数。与Mysql的独立表空间类型 • maxConns:最大链接数 • repairpath:执行repair时的临时目录。在如果没有开启joumal,异常down机后重启,必须执行repair操作。
MongoDB插入记录 • 我们建一个17car的集合然后写入数据,建立数据.并保存到集合中去1、先执行show dbs 列出当前的数据库2、定义新的数据库名,use 17car(use databasename语法),注意,这时数据库还没建立起来,不过可以继续使用,因为mongodb会在真正插入了数据后,自动建立这个数据库。use 17car后只表明目前正在使用17car集合了。3、保存数据:定义一个collection,"member",然后插入数据。>db.member.save({username:"batu",mobile:"18691635352"})>db.member.find() • >show dbs(这时17car数据库就出现了) • 注意:1、不需要预先创建一个集合,在第一次插入数据会自动创建2、在文档中可以存储任何结构数据3、每次插入数据时候集合中都会有一个ID,名字叫 _id.
MongoDB _id key • _id是自有产物存储在MongoDB集合中的每个文档都有一个默认主键_id,这个主键名称是固定的,它可以是MongoDB支持的任何数据类型,默认是Objectid.在Mysql关系数据库schema设计中,主键大多是数值型的,比如常用int和long,并且更通常的是主键的取值由数据库自增获取,反观MongoDB,它在设计之初就定位于分布式存储系统,所以它原声的不支持自增主键。 • 举例说明我们往17car集合写入一条文档时,系统会自动生成一个名为_id的 key----------分割线 --- 代码演示 -------这里多出了一个类型为Objectid的 key,在插入时没有指定,属于自动生成
注:在MongoDB中,每一个集合的文档都必须有一个叫_id的字段,字段类型默认是Objectid,换句话说字段类型也可以不是Objectid类型。如下:注:在MongoDB中,每一个集合的文档都必须有一个叫_id的字段,字段类型默认是Objectid,换句话说字段类型也可以不是Objectid类型。如下: > db.member.insert({_id:3,username:"batu1"})【注意:同一个集合中_id必须唯一,如果重复系统会抛出异常】> db.member.find()
MongoDB查询记录 • 普通查询:我们先从简单查询开始,具体看查询中怎么返回一个游标对象,可以简单的通过find()查询,他返回一个任意结构的集合。>db.member.find() • 使用JavaScript shell,可以用到js的特性,forEach可以输出游标了:forEach()必须定义一个函数供每个游标元素调用。>db.member.find().forEach(printjson); • 在MongoDB shell里,我们可以把游标当作数组来用>var cursor = db.member.find();>printjson(cursor[1]);注:使用游标时候注意占用内存的问题,特别是很大的游标对象,可能会出现内存溢出,所以用迭代的方式输出合理一些,下面我们用迭代方式输出。>var cursor = db.member.find();>while(cursor.hasNext()) printjson(cursor.next());
游标转换成真实的数组类型>var arr = db.member.find().toArray();>arr[1];注意:这些特性只是在MongoDB shell 里使用,而不是所有的其他应用驱动都支持,具体参考各个应用驱动官方文档。如果有其他用户在集合里第一次或最后一次调用next(),我们可能得不到游标里的数据,所以要明确的锁定要查询的游标。
MongoDB条件查询 • 先简单看一个类似SQL的条件查询方式select * from car_member where username="batu"===========对照MongoDB条件查询===>db.member.find({username:"batu"}).forEach(printjson);查询条件是{a:1,b:2,...} 类似SQL的 "where a=1 and b=2 and ..."上面显示的是所有的元素,我们也可以返回特定的元素,类似返回表里面某个字段值,只需要在find({username:"batu"})里指定元素的名称>db.member.find({username:"batu"},{mobile:true}).forEach(printjson); • findOne()语法:MongoDB shell避免游标可能带来的开销,提供一个findOne()函数,这个函数和find()函数一样,不过它返回的是游标里的第一条数据,或者返回Null
例如,username="batu" 可以用很多方法来实现,可以用next()来循环游标或当做数组返回第一个元素。但是用findOne()方法则更简单和高效>printjson(db.member.findOne({username:"batu"})); • 通过limit限制结果集数量如果需要限制结果集的长度,那么可以调用limit方法>db.member.find().limit(1);
MongoDB修改记录 • 修改是用update方法例如,将列username的值从"butu" 修改为"batus">db.member.update({username:"batu"},{$set:{username:"batus"}});
MongoDB删除记录 • 删除记录是用remove方法例如,将username是“batus”的记录从集合member中删除>db.member.remove({username:"batus"});
常用GUI管理工具 • MongoVUE • RockMongo • MongoHub
第二篇预告:MongoDB高级使用 • 高级查询查询操作符 & 语法 & 联合查询 & 游标和存储过程 • 高级更新数据更新命令update,save • 高级特性高并发数据存储Map分组聚合计算获取结果格式化输出定制输出 • PHP应用驱动相关使用方法