NoSql数据库mongodb应用说明.doc_第1页
NoSql数据库mongodb应用说明.doc_第2页
NoSql数据库mongodb应用说明.doc_第3页
NoSql数据库mongodb应用说明.doc_第4页
NoSql数据库mongodb应用说明.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

MongoDB应用说明 NoSql数据库MongoDB应用说明中科软科技股份有限公司技术组2011年 6月关于本文档主 题NoSql数据库mongodb应用说明说明将理论中的NoSql数据库提升到应用的层面适用对象修 订 历 史版 本章 节类 型日 期作 者说 明V1.0全部C2011-06-13姚春阳创建说明:类型创建(C)、修改(U)、删除(D)、增加(A);评 审 记 录 角 色签 名日 期说 明目 录1.前言51.1.目的51.2.范围61.3.名词和缩略语61.4.参考文档62.Mongodb72.1.简介72.2.特点72.3.使用原理82.4.安装92.4.1.Linux/Unix/OS X下92.4.2.Windows下102.4.3.基本命令102.4.4.常用语法113.Mongodb应用123.1.查询123.1.1.条件操作符123.1.2.查询举例123.2.MongoDB之GridFS173.3.数据复制、自动分片173.4.Java程序简要用法183.4.1.建立连接183.4.2.安全验证(非必选)193.4.3.获取集合列表193.4.4.获得一个集合193.4.5.插入文档203.4.6.使用findOne()查找集合中第一个文档203.4.7.加入多种文档213.4.8.统计文档数量223.4.9.使用光标(cursor)来获取全部文档223.4.10.在查询中获取单一文档223.4.11.使用条件查询获取集合223.4.12.创建索引233.4.13.获取索引列表233.4.14.MongoDB管理函数233.4.15.用DBObject存储JAVA对象243.4.16.JAVA驱动的并发性254.附录:附件文件251. 前言随着越来越多的个性化应用需求及业务需求的提出,传统关系型数据库在写入和查询上不断出现瓶颈,导致我们的业务应用在某些功能点上由于关系型数据库的写入和查询效率问题造成了非常大的性能瓶颈,而内存缓存的使用又无法做到一些业务数据的持久化导致缓存应用仅能将一些非必要的代码数据暂时放入缓存,而应用服务一旦宕机或重启将无法维持使用需要重新载入。NoSql非关系型数据库不但能够解决数据持久化的问题,从设计上完全建立在针对利用高性能闪存之上,解决了传统缓存的持久化问题。从数据库角度来讲NoSql数据库虽然无法满足严格的事物处理需求,但作为缓存以及实时的非事物性数据的存储设备却完全体现了其高速、可靠以及扩展的各种性能需求。1.1. 目的在各种各样的业务系统中,我们习惯性的使用java的Map来充当缓存,但Map在应用中的生命期是与业务应用相同的,也就是一旦宕机将失去Map中所有数据,而且保存在Map中的数据属于在java所开辟的内存中,当数据不断写入的同时挤占了java进程的内存空间同时不方便管理内存中数据,而引入NoSql数据库将解决以上所有问题。为什么我们要引入NoSql:1、 High performance - 对数据库高并发读写的需求在业务应用生产环境中根据不同公司的业务量会对我们的应用系统有着不同的并发访问需求,高并发访问业务系统并处理业务数据时数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了,由此瓶颈出现在硬件读写速度上。2、 Huge Storage - 对海量数据的高效率存储和访问的需求以影像系统为例,随着业务量的不断递增,我们的影像数据索引表中的内容会与日俱增,而此表会在日常业务应用中不断写入和查询,高数据量的数据表在检索时虽然可以采用索引进行检索,但实际情况证明即使使用了相关索引查询某业务下的影像数据时由于数据趋于海量其检索速度并不乐观,目前对该表的可行性优化即根据日期条件进行分表处理,但此操作需要过多人工干预无法实现完全自动化。另外的一个非常突出的案例就是各种接口日志以及系统异常日志的存储问题。3、 High Scalability & High Availability- 对数据库的高可扩展性和高可用性的需求对于数据库的横向扩展问题应该不需多说了,传统数据库(oracle、informix等)在横向扩展性方面都存在很大的不足,而目前NoSql中的mongodb则做到了完全意义上的水平扩展。包括容量扩展完全可采用价格低廉的设备中进行。1.2. 范围本次简要描述NoSql数据库产品家族中的mongodb的安装及使用,为个项目组技术人员增加性能优化思路。1.3. 名词和缩略语名词及缩略语解释技术层术语NoSqlNoSQL(NoSQL = Not Only SQL ),指的是非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。mongodb MongoDB是一个基于分布式文件存储的数据库.由C+语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.1.4. 参考文档文档名说明2. Mongodb2.1. 简介MongoDB是一个基于分布式文件存储的数据库.由C+语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案。2.2. 特点它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:n 面向集合存储,易存储对象类型的数据。 n 模式自由。n 支持动态查询。 n 支持完全索引,包含内部对象。 n 支持查询。 n 支持复制和故障恢复。 n 使用高效的二进制数据存储,包括大型对象(如视频等)。n 自动处理碎片,以支持云计算层次的扩展性n 支持RUBY,PYTHON,JAVA,C+,PHP等多种语言。n 文件存储格式为BSON(一种JSON的扩展)n 可通过网络访问。适用场景:n 适合作为信息基础设施的持久化缓存层 。n 适合实时的插入,更新与查询,并具备应用程序实时数据存储所需的复制及高度伸缩性。n Mongo的BSON数据格式非常适合文档化格式的存储及查询 。n 适合由数十或数百台服务器组成的数据库。因为Mongo已经包含了对MapReduce引擎的内置支持。不适用场景:n 要求高度事务性的系统。n 传统的商业智能应用。n 复杂的跨文档(表)级联查询。2.3. 使用原理所谓“面向集合”(Collenction-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。 模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。 存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。工作方式: MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富并且最像关系型数据库。 传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB同样也是由数据库(database) 、集合(collection)、文档对象(document)三个层次组成。 MongoDB里的集合对应于关系型数据库里的表,但是集合中没有列、行和关系的概念,这体现了模式自由的特点。 在MongoDB中数据以单文档为单位存储,这样就能在单个数据对象中表示复杂的关系。文档可以由独立的基本类型属性、内嵌文档或文档数组组成。 MongoDB存储的数据格式是key-value对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档对象。这种数据格式称作 BSON,即 “Binary Serialized Document Notation”,是一种类似JSON的二进制序列化文档 。 MongoDB是一个免安装的数据库,将它解压后生成一个bin目录(v1.6) ,其中包含10个可执行文件,除此之外不再需要任何其它的二进制依赖文件。 通常情况下启动数据库只需要关注其中的两个可执行文件:mongod.exe和mongo.exe。前者是MongoDB数据库进程本身,是核心数据库服务器,后者是命令行Shell客户端,其使用方法通常类似于MySQL命令行Shell客户端,用于确保所有内容都已正常安装且能正常运行,并且可以对数据进行CRUD操作、执行管理任务等等。 MongoDB使用了内存映射文件进行数据管理,把所有空闲内存当缓存使用,且不能指定内存大小。这既是优点也是缺点:优点-可以最大限度提升性能;缺点-容易受其它程序干扰。 数据空间采用预分配,目的是为了避免形成过多的硬盘碎片。它为每个数据库分配一系列文件,每个数据文件都会被预分配一个大小,第一个文件名字为“.0 ” ,大小为64MB,第二个文件“.1”为128MB ,依此类推,在32位模式运行时支持的最大文件为2GB。随着数据量的增加,可以在其数据目录里看到这些不断递增的文件。 MongoDB没有自动递增或序列特性,当BSON对象插入到数据库中时,如果没有提供“_id”字段 ,数据库会自动生成一个ObjectId对象作为“_id”的值插入到集合中作为该文档的主键(这就避免了其它数据库意外地选择相同的惟一标识符的情况) ,“_id”的值由4字节的时间戳,3字节的机器号,2字节的进程id以及3字节的自增计数组成。当然字段“_id”的值可以手动生成(任意类型都可),只要能够保证惟一性。 每个插入的BSON对象大小不能超过4MB,如果超过4M时需使用 GridFS来储存数据。 删除记录后不会释放已分配的空间,换句话说:原记录空间不删除。2.4. 安装2.4.1. Linux/Unix/OS X下1、建立数据目录mkdir -p /data/db2、下载压缩包curl -O/linux/mongodb-linux-i686-latest.tgz或下载安装包后上传至服务器3、解压缩文件tar xzf mongodb-linux-i386-latest.tgz4、启动服务bin/mongod run &5、使用自带客户端连接/bin/mongo6、测试db.foo.save( a : 1 )db.foo.findOne()2.4.2. Windows下1、建立数据目录c:datadb2、下载压缩包,解压文件3、启动服务binmongod.exe run4、自带客户端binmongon.exe在LINUX和WINDOWS系统下的使用大同小异,不同的地方主要是默认的数据存储目录。LINUX类系统下存放在/data/db下,而WINDOWS会存放在C:datadb下。可以在启动时使用-dbpath参数指定存储目录并启动。如:binmongod.exe -dbpath d:datamongo2.4.3. 基本命令1、启动命令n mongod 启动数据库进程n -dbpath 指定数据库的目录n -port 指定数据库的端口,默认是27017n -bind_ip 绑定IPn -directoryperdb为每个db创建一个独立子目录n -logpath指定日志存放目录n -logappend指定日志生成方式(追加/覆盖)n 例如:mongod -dbpath db -port 27098-directoryperdb -logpath dblogsmongodb.log logappend2、停止服务关闭数据有两种方式:n 在窗口模式中,可以直接使用Ctrl+C停止服务n 通过mongo连接至客户端,并使用db.shutdownServer()停止服务。3、其它命令n show dbs / 列出所有数据库n use test / 使用数据库test ,即使这个数据库不存在也可以执行,但该数据库不会立刻被新建,要等到执行了insert之类的操作时,才会建立这个数据库n show collections / 列出当前数据库的所有文档n db / 显示当前数据库n show users / 列出用户n 4、帮助命令n 想知道mongodb支持哪些命令,可以直接输入help、如果想知道当前数据库支持哪些方法,可以使用db.help()命令、如果想知道当前数据库下的表或者表collection支持哪些方法,可以使用命令db.dbname.help()。2.4.4. 常用语法1、连接数据库、创建数据集n 使用mongo命令可以连接到数据库中,默认是连接到test的数据库。n 使用db.createCollection(“mycoll”),或db.createCollection(“mycoll”, size :100 , capped :true, max :1000 )创建数据集。2、添加操作n 添加普通数据使用db.collname.insert或db.collname.save(.)命令3、修改操作n 修改普通数据使用db.collname.update()4、查询操作n 查询数据使用db.collname.find()n MongoDB的查询语法很强大, 很多SQL可以做的,它都可以做。n 计算集合的总记录数、分页查询、按条件查询、in 查询 、查询排序、动态查询等等。n 但不支持JOIN,这样带来的好处是数据更易于管理,消除了传统关系型数据库中影响性n 能和水平扩展性的“JOIN”操作5、删除操作n 删除数据使用db.collname.remvoe()命令n 可以按条件删除某条或多条数据3. Mongodb应用3.1. 查询3.1.1. 条件操作符$gt : $lt : = $lte: = $ne : !=、 $in : in $nin: not in $all: all $not: 反匹配(1.3.3及以上版本)3.1.2. 查询举例查询 name = bruce 的数据 db.users.find( name : bruce ); 查询 name bruce and age = 18 的数据 db.users.find(name: $ne: bruce, age: $gte: 18); 查询 creation_date 2010-01-01 and creation_date 18 的记录,以下查询都一样 db.users.find(age: $gt: 18); db.users.find($where: this.age 18); db.users.find(this.age 18); f = function() return this.age 18 db.users.find(f); 排序sort() 以年龄升序asc db.users.find().sort(age: 1); 以年龄降序desc db.users.find().sort(age: -1); 限制返回记录数量limit() 返回5条记录 db.users.find().limit(5); 返回3条记录并打印信息 db.users.find().limit(3).forEach(function(user) print(my age is + user.age); 结果 my age is 18 my age is 19 my age is 20 限制返回记录的开始点skip() 从第3条记录开始,返回5条记录(limit 3, 5) db.users.find().skip(3).limit(5); 查询记录条数count() db.users.find().count(); db.users.find(age:18).count(); 以下返回的不是5,而是user表中所有的记录数量 db.users.find().skip(10).limit(5).count(); 如果要返回限制之后的记录数量,要使用count(true)或者count(非0) db.users.find().skip(10).limit(5).count(true); 分组group() 假设test表只有以下一条数据 domain: , invoked_at: d:2009-11-03, t:17:14:05 , response_time: 0.05 , http_action: GET /display/DOCS/Aggregation 使用group统计test表11月份的数据count:count(*)、total_time:sum(response_time)、avg_time:total_time/count; db.test.group( cond: invoked_at.d: $gt: 2009-11, $lt: 2009-12 , key: http_action: true , initial: count: 0, total_time:0 , reduce: function(doc, out) out.count+; out.total_time+=doc.response_time , finalize: function(out) out.avg_time = out.total_time / out.count ); http_action : GET /display/DOCS/Aggregation, count : 1, total_time : 0.05, avg_time : 0.05 3.2. MongoDB之GridFSMongoDB提供的工具mongofiles可以从命令行操作GridFS,如上传文件:n mongofiles put C:jtts4_sapi5.logn 获得上传后的文件:n mongofiles get C:jtts4_sapi5.logn MongoDB提供的API可以像操作普通文件一样对GridFS文件进行操作,包括read(),write(),tell(),seek()等。3.3. 数据复制、自动分片MongoDB提供了两种复制数据的方式master-slave和master-master ;在实际应用中可以实现数据的读写分离,通过任意数量的从服务器来进行读操作,这有利于提高读的可扩展性。n master-slave配置很简单,只需在主服务器启动时上加-master 选项,在从服务启动时上加-slave和-source选项即可,这样在主数据库更新数据的同时,会自动的把数据复制到从数据库中。master-master复制与master-slave的区别是即可读又可写。n 目前MongoDB不支持完全的mastermaster复制,通常情况下不推荐使用master-master模式。n 配置master-master只需运行mongod时同时加上-master选项和-slave选项。n MongoDB提供了replica pairs模式启动数据库,以这种方式启动后,数据库会自动协商谁是master谁是slave。一旦一个数据库服务器断电,另一个会自动接管,并从那一刻起起为master。万一另一个将来也出错了,那么master状态将会转回给第一个服务器。n 以这种方式启动,使用mongod的命令如下:mongod -pairwith -arbiter 自动分片n MongoDB包括一个自动分片的的模块“mongos”,从而可以构建一个大的水平可扩展的数据库集群,可以动态地添加服务器,自动建立一个水平扩展的数据库集群系统,将数据库分表存储在sharding的各个节点上 ,如下是一个数据库集群的示意图:sharding的配置n 如果要配置sharding,先要允许一个数据库sharding,然后要指定数据库里集合的分片方式,这些都有相应的命令可以完成。3.4. Java程序简要用法3.4.1. 建立连接要建立MongoDB的连接,你只要指定要连接到的数据库就可以。这个数据库不一定存在,如果不存在,MongoDB会先为你建立这个库。同时,在连接时你也可以具体指定要连接到的网络地址和端口。下面的是连接本机数据库的一些例子:import com.mongodb.Mongo;import com.mongodb.DBCollection;import com.mongodb.BasicDBObject;import com.mongodb.DBObject;import com.mongodb.DBCursor;import com.mongodb.MongoAdmin;Mongo db = new Mongo(mydb);Mongo db = new Mongo(localhost, mydb);Mongo db = new Mongo(localhost, 27017, mydb);3.4.2. 安全验证(非必选)MongoDB服务可以在安全模式运行,此时任何客户端要连接数据库时需使用用户名和密码。在JAVA中可使用如下方法连接:boolean auth = db.authenticate(userName, password);如果用户名密码验证通过,返回值为true,否则为false3.4.3. 获取集合列表每个数据库都存在零个或多个集合,需要时你可以获得他们的列表:Set colls = db.getCollectionNames();for(String s : colls)System.out.println(s);3.4.4. 获得一个集合要获得某个特定集合,你可以指定集合的名字,并使用getCollection()方法:DBCollection coll = db.getCollection(testCollection);当你获取了这个集合对象,你就可以对数据进行增删查改之类的操作。3.4.5. 插入文档当你获得了一个集合对象,你就可以把文档插入到这个对象中。例如,存在一个JSON式的小文档:name : MongoDB,type : database,count : 1,info : x : 203,y : 102 请注意,这个文档包含一个内部文档。我们可以使用BasicDBObject类来创建这个文档,并且使用insert()方法方便地将它插入到集合中。BasicDBObject doc = new BasicDBObject();doc.put(name, MongoDB);doc.put(type, database);doc.put(count, 1);BasicDBObject info = new BasicDBObject();info.put(x, 203);info.put(y, 102);doc.put(info, info);coll.insert(doc);3.4.6. 使用findOne()查找集合中第一个文档要查找我们上一步插入的那个文档,可以简单地使用findOne()操作来获取集合中第一个文档。这个方法返回一个单一文档(这是相对于使用DBCursor的find()操作的返回),这对于只有一个文档或我们刚插入第一个文档时很有用,因为此时并不需要使用光标。DBObject myDoc = coll.findOne();System.out.println(myDoc);返回类似:_id : ac907a1f5b9d5e4a233ed300 ,name : MongoDB ,type : 1 ,info : x : 203 ,y : 102 ,_ns : testCollection注意_id和_ns元素是由MongoDB自动加入你的文档。记住:MongoDB内部存储使用的元素名是以“_”做为开始。3.4.7. 加入多种文档为了做更多有趣的查询试验,让我们向集合中加入多种文档类型,象:i : value可以通过循环来实现for(int i = 0; i 50的文档:BasicDBObject query = new BasicDBObject();query.put(i, new BasicDBObject($gt, 50);cur = coll.find(query);while(cur.hasNext()System.out.println(cur.next();当然,我们也可以做20 i = 30的查询BasicDBObject query = new BasicDBObject();query.put(i, new BasicDBObject($gt, 20).append($lte, 30);cur = coll.find(query);while(cur.hasNext()System.out.println(cur.next();3.4.12. 创建索引MongoDB支持索引

温馨提示

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

评论

0/150

提交评论