Mongodb相关技术分享资料课件

上传人:20****08 文档编号:241320001 上传时间:2024-06-17 格式:PPTX 页数:79 大小:480.41KB
返回 下载 相关 举报
Mongodb相关技术分享资料课件_第1页
第1页 / 共79页
Mongodb相关技术分享资料课件_第2页
第2页 / 共79页
Mongodb相关技术分享资料课件_第3页
第3页 / 共79页
点击查看更多>>
资源描述
MongoDB相关技术徐如庆2013-04-22MongoDB相关技术徐如庆1概念概念MongoDB是一个基于分布式文件存储的数据库。由C+语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。MongoDBMongoDB入入门门概念MongoDB入门2特点特点高性能、易部署、易使用,存储数据非常方便。主要功能特性有:面向集合存储,易存储对象类型的数据。模式自由。使用高效的二进制数据存储,包括大型对象(如视频等)。支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C+语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。文件存储格式为BSON(一种JSON的扩展)。MongoDBMongoDB入入门门特点MongoDB入门3完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。http:/IP:28017/复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。MongoDBMongoDB入入门门完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化4适用适用场合合网站网站数据数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。缓存存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。大尺寸,低价大尺寸,低价值的数据的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。高伸高伸缩性的性的场景景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo已经包含对MapReduce引擎的内置支持。用于用于对象及象及JSON数据的存数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。MongoDBMongoDB入入门门适用场合MongoDB入门5不适用不适用场合合高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。MongoDBMongoDB入入门门不适用场合MongoDB入门6与mysql对比传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成。MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。集合相当于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。MongoDBMongoDB入入门门与mysql对比MongoDB入门7下下载下载地址:http:/www.mongodb.org/downloads下载安装包:官方下载地址单击此处,如果是win系统,注意是64位还是32位版本的,请选择正确的版本。MongoDBMongoDB入入门门下载MongoDB入门8安装与配置安装与配置一、解压缩文件。将压缩包解压,在D盘创建文件夹MongoDB,将压缩包中所有的.exe文件拷到D:MongoDB文件夹中。二、建立工作目录1、建立数据存放目录D:mongodbdata2、建立日志文件D:mongodblogmongodb.log三、设置系统变量。为了方便从控制台中管理mongodb.找到所有的exe的文件的路径,此为D:MongoDBbin添加到path后面,添加之前加一个“;”;四、将mongdb作为windows服务随机启动控制台中输入:mongod-logpathD:MongoDBlogmongodb.log-logappend-dbpathD:MongoDBdata-directoryperdb-serviceNamemongodb223-installMongoDBMongoDB入入门门安装与配置MongoDB入门9安装与配置安装与配置五、连接mongodb在控制台中输入netstartmongodb223,会出现“MongoDB服务已经启动成功”的提示。停止:mongodb:netstopmongodb223输入mongo,就会连接到test.在我的电脑-管理-服务和应用程序中可以看到MongoDB服务已经成功启动MongoDBMongoDB入入门门安装与配置MongoDB入门10安装与配置安装与配置六、shell操作数据库Win下输入mongo.exe进入如下界面:MongoDBMongoDB入入门门安装与配置MongoDB入门11用户与权限1、基于MongoDB的数据存储没有使用到权限访问(MongoDB默认设置为无权限访问限制)2、可以通过注册表修改启动项添加-auth设置权限,设置权限后,需要验证通过后才可以操作。注:设置权限后,需要重启服务才有效。MongoDBMongoDB入入门门用户与权限MongoDB入门12用用户相关相关#增加或修改用户密码db.addUser(name,pwd)#查看用户列表db.system.users.find()/admin权限#用户认证db.auth(name,pwd)#删除用户db.removeUser(name)#查看所有用户showusersMongoDBMongoDB入入门门用户相关MongoDB入门13普通操作新建集合集:db.createCollection(user);删除collectiondb.user.drop()删除当前的数据库db.dropDatabase()MongoDBMongoDB操作操作普通操作MongoDB操作14增加数据 db.user.insert(uid:1,username:Falcon.C,age:25);var j=name:mongo;db.things.save(j);#存储嵌套的对象db.foo.save(name:ysz,address:city:beijing,post:100096,phone:138,139)#存储数组对象db.user_addr.save(Uid:,Al:test-,test-)MongoDBMongoDB操作操作增加数据MongoDB操作15更新数据db.user.update(uid:1,$set:age:26)#age=26db.user.update(uid:1,$inc:age:-1)#age=age-1db.foo.update(yy:5,$set:xx:2,upsert=true,multi=true)注释:db.collection.update(criteria,objNew,upsert,multi)criteria:update的查询条件,类似sqlupdate查询内where后面的objNew:update的对象和一些更新的操作符(如$,$inc.)等,也可以理解为sqlupdate查询内set后面的upsert:这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。multi:mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。MongoDBMongoDB操作操作更新数据MongoDB操作16删除数据#删除yy=5的记录db.foo.remove(yy:5)#删除所有的记录db.foo.remove()MongoDBMongoDB操作操作删除数据MongoDB操作17查询#查找所有db.foo.find()#查找一条记录db.foo.findOne()var mongo=db.things.findOne(name:mongo);print(tojson(mongo);#根据条件检索记录db.things.find(name:mongo)#子对象的查找db.foo.find(address.city:beijing)MongoDBMongoDB操作操作查询MongoDB操作18sortsort用法用法:db.things.find(tags:economy).sort(ts:-1).limit(10);1表示为以ts升序排序,若为-1,即为降序排序。等价于:SQL:select*from things where economy in tags order by ts DESC limit 10MongoDBMongoDB操作操作sort用法:MongoDB操作19limitlimit用法用法:db.things.find().limit(3);countcount操作操作:db.user_addr.count()distinctdistinctdb.foo.distinct(msg)MongoDBMongoDB操作操作MongoDB操作20条件条件操作符操作符$gt:$lt:=$lte:=$ne:!=、$in:in$nin:notin$all:all$not:反匹配#”=”操作db.foo.find(timestamp:$gte:2)更多的在http:/docs.mongodb.org/manual/reference/operator/type/MongoDBMongoDB操作操作条件操作符MongoDB操作21索引索引MongoDB提供了多样性的索引支持,索引信息被保存在system.indexes中,且默认总是为_id创建索引,它的索引使用基本和MySQL等关系型数据库一样。其实可以这样说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口。MongoDBMongoDB操作操作索引MongoDB操作22基基础索引索引在字段age上创建索引,1(升序);-1(降序):db.users.ensureIndex(age:1)_id是创建表的时候自动创建的索引,此索引是不能够删除的。当系统已有大量数据时,创建索引就是个非常耗时的活,我们可以在后台执行,只需指定“backgroud:true”即可。db.t3.ensureIndex(age:1,backgroud:true)MongoDBMongoDB操作操作基础索引MongoDB操作23文档文档索引索引索引可以任何类型的字段,甚至文档:db.factories.insert(name:wwl,addr:city:Beijing,state:BJ);/在addr列上创建索引db.factories.ensureIndex(addr:1);/下面这个查询将会用到我们刚刚建立的索引db.factories.find(addr:city:Beijing,state:BJ);/但是下面这个查询将不会用到索引,因为查询的顺序跟索引建立的顺序不一样db.factories.find(addr:state:BJ,city:Beijing);MongoDBMongoDB操作操作文档索引MongoDB操作24组合索引合索引跟其它数据库产品一样,MongoDB也是有组合索引的,下面我们将在addr.city和addr.state上建立组合索引。当创建组合索引时,字段后面的1表示升序,-1表示降序,是用1还是用-1主要是跟排序的时候或指定范围内查询的时候有关的。db.factories.ensureIndex(addr.city:1,addr.state:1);/下面的查询都用到了这个索引db.factories.find(addr.city:Beijing,addr.state:BJ);db.factories.find(addr.city:Beijing);db.factories.find().sort(addr.city:1,addr.state:1);db.factories.find().sort(addr.city:1)MongoDBMongoDB操作操作组合索引MongoDB操作25唯一唯一索引索引只需在ensureIndex命令中指定”unique:true”即可创建唯一索引。例如,往表t4中插入2条记录:db.t4.ensureIndex(firstname:1,lastname:1,unique:true);强制使用索引制使用索引hint命令可以强制使用某个索引。db.t5.find(age:$lt:30).hint(name:1,age:1)删除除索引索引/删除t3表中的所有索引db.t3.dropIndexes()/删除t4表中的firstname索引db.t4.dropIndex(firstname:1)MongoDBMongoDB操作操作唯一索引MongoDB操作26explain执行行计划划MongoDB提供了一个explain命令让我们获知系统如何处理查询请求。利用explain命令,我们可以很好地观察系统如何使用索引来加快检索,同时可以针对性优化索引。MongoDBMongoDB操作操作explain执行计划MongoDB操作27db.t5.ensureIndex(name:1)db.t5.ensureIndex(age:1)db.t5.find(age:$gt:45,name:1).explain()cursor:BtreeCursorage_1,nscanned:0,nscannedObjects:0,n:0,millis:0,nYields:0,nChunkSkips:0,isMultiKey:false,indexOnly:false,indexBounds:age:45,1.7976931348623157e+308MongoDBMongoDB操作操作db.t5.ensureIndex(name:1)28字段说明:cursor:返回游标类型(BasicCursor或BtreeCursor)nscanned:被扫描的文档数量n:返回的文档数量millis:耗时(毫秒)indexBounds:所使用的索引isMultiKey:isaboolean.Whentrue,thequeryusesamultikey index,whereoneofthefieldsintheindexholdsanarray.nscannedObjects:Specifiesthetotalnumberofdocumentsscannedduringthequery.nYields:nYieldsisanumberthatreflectsthenumberoftimesthisqueryyieldedthereadlocktoallowwaitingwritesexecute.MongoDBMongoDB操作操作字段说明:MongoDB操作29indexOnly:indexOnlyisabooleanvaluethatreturnstruewhenthequeryiscoveredbytheindexindicatedinthecursorfield.nChunkSkips:nChunkSkipsisanumberthatreflectsthenumberofdocumentsskippedbecauseofactivechunkmigrationsinashardedsystem.Typicallythiswillbezero.Anumbergreaterthanzeroisok,butindicatesalittlebitofinefficiency.更多参数讲解:http:/docs.mongodb.org/manual/reference/explain/MongoDBMongoDB操作操作indexOnly:indexOnlyisaboole30开启开启profiling功能功能有两种方式可以控制Profiling的开关和级别,第一种是直接在启动参数里直接进行设置。启动MongoDB时加上profile=级别即可。也可以在客户端调用db.setProfilingLevel(级别)命令来实时配置,Profiler信息保存在system.profile中。我们可以通过db.getProfilingLevel()命令来获取当前的Profile级别,类似如下操作:db.setProfilingLevel(2);上面profile的级别可以取0,1,2三个值,他们表示的意义如下:0不开启1记录慢命令(默认为100ms)2记录所有命令Profile记录在级别1时会记录慢命令,那么这个慢的定义是什么?上面我们说到其默认为100ms,当然有默认就有设置,其设置方法和级别一样有两种,一种是通过添加slowms启动参数配置。第二种是调用db.setProfilingLevel时加上第二个参数:db.setProfilingLevel(level,slowms)db.setProfilingLevel(1,10);MongoDBMongoDB优优化化开启profiling功能MongoDB优化31查询 Profiling 记录MongoDBProfile记录是直接存在系统db里的,记录位置system.profile,所以,我们只要查询这个Collection的记录就可以获取到我们的Profile记录了。列出执行时间长于某一限度(5ms)的Profile记录:db.system.profile.find(millis:$gt:5)MongoDBShell还提供了一个比较简洁的命令showprofile,可列出最近5条执行时间超过设定时间的Profile记录。MongoDBMongoDB优优化化查询Profiling记录MongoDB优化32Mongo连接接Mongomg=newMongo();无参数时,使用默认的。Host:127.0.01,port:27017Mongomg=newMongo(localhost);默认端口为:27017Mongomg=newMongo(localhost,27017);用mongoDB驱动直接开发Mongo连接用mongoDB驱动直接开发33获取数据库DBdb=mg.getDB(test);获取名为test的数据库。获取数据库表DBCollectionusers=db.getCollection(user);获取test数据库下的user表。用mongoDB驱动直接开发获取数据库用mongoDB驱动直接开发34插入数据DBObjectuserObj=newBasicDBObject();#BasicDBObject实现BSONObject接口;userObj.put(“username”,“张三);userObj.put(“age,“20);users.insert(userObj);用mongoDB驱动直接开发插入数据用mongoDB驱动直接开发35删除数据DBObjectuserObj=newBasicDBObject(“username”,“张三);users.remove(userObj);用mongoDB驱动直接开发删除数据用mongoDB驱动直接开发36修改数据DBObjectoldObj=newBasicDBObject(“username”,“张三);DBObjectnewObj=newBasicDBObject();newObj.put(“username”,“张三);newObj.put(“age,“80);users.update(oldObj,newObj,true,false);参数说明:oldObj是update的查询条件,类似sqlupdate查询内where后面的;objNew:update的对象和一些更新的操作符(如$,$inc.)等,也可以理解为sqlupdate查询内set后面的;upsert:如果不存在update的记录,是否插入newObj,true为插入,默认是false,不插入。类似saveOrUptatemulti:mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。用mongoDB驱动直接开发修改数据用mongoDB驱动直接开发37查询DBCollectionusers=db.getCollection(user);DBCursorcur=users.find();/实现Iterator迭代器接口DBObjectobject=null;while(cur.hasNext()object=cur.next();System.out.println(object);/取出对象中列表为username和age的数据System.out.println(username:+object.get(“username)+tupwd:+object.get(“age)+t_id:+object.get(_id);用mongoDB驱动直接开发查询用mongoDB驱动直接开发38查询find()Queriesforallobjectsinthiscollection.find(DBObjectref)Queriesforanobjectinthiscollection.findAndModify(DBObjectquery,DBObjectupdate),找到更新findAndRemove(DBObjectquery),找到删除findOne()获取一条findOne(DBObjecto)获取一条Returnsasingleobjectfromthiscollectionmatchingthequery.getCount()返回总数。createIndex创建索引,getIndexInfo查询索引,dropIndex删除索引更多api说明:http:/api.mongodb.org/java/2.7.3/用mongoDB驱动直接开发查询用mongoDB驱动直接开发39保持操作在同一个连接中执行:在多个连接中使用。在com.mongodb.DB里有两个重要的方法;requestStart()startsanewconsistentrequest.requestDone()endsthecurrentconsistentrequest“类似其他数据库中在同一个事务里执行。用mongoDB驱动直接开发保持操作在同一个连接中执行:用mongoDB驱动直接开发40根据ObjectId查询:DBCursorcur=coll.find(newBasicDBObject(_id,newObjectId(id);/直接用string查不出来And多条件查询BasicDBObjectquery=newBasicDBObject();query.put(intData,intData);query.put(longData,longData);coll.findOne(query);OR多条件查询BasicDBListcond=newBasicDBList();cond.add(cond1);cond.add(cond2);query.put($or,cond);用mongoDB驱动直接开发根据ObjectId查询:用mongoDB驱动直接开发41NOT查询BasicDBObjectquery=newBasicDBObject();BasicDBListcond=newBasicDBList();cond.add(value1);cond.add(value2);query.put(intData,newBasicDBObject($nin,cond);coll.find(query).count();用mongoDB驱动直接开发NOT查询用mongoDB驱动直接开发42查询文档部分列DBCursorcur=coll.find(newBasicDBObject(),newBasicDBObject(intData,true);查询内嵌文档coll=getCollection(ParentColl);BasicDBObjectmap=newBasicDBObject();map.put(innertype,string1);map.put(innerContent,string0);DBCursorcur=coll.find(newBasicDBObject(documentData,map);用mongoDB驱动直接开发查询文档部分列用mongoDB驱动直接开发43查询内嵌部分文档DBCursorcur=coll.find(newBasicDBObject(documentData.innerColumn,“value);查看分页文档DBCursorcur=coll.find().skip(skipNum).limit(pageNum);查询文档某列是否存在DBCursorcur=coll.find(newBasicDBObject(longData,newBasicDBObject($exists,true);查询文档排序DBCursorcur=coll.find().sort(newBasicDBObject(intData,-1);/1:asc/-1:descdistinct查询coll.distinct(documentData.innertype);用mongoDB驱动直接开发查询内嵌部分文档用mongoDB驱动直接开发44什么是什么是Morphia Morphia是一个开放源代码的对象关系映射框架,它对MongoDB数据库java版驱动进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵MongoDB数据库,也让Java程序员可以从复杂数据库设计中脱离出来,从而将更多的精力投入到业务逻辑中去。用mophia开发什么是Morphia用mophia开发45特征它易于使用,而且非常轻巧,每种类型使用一次反射。数据存储(DataStore)和DAO访问抽象,或自己实现.使用运行时验证的类型安全(Type-safe)和Fluent查询(Query)支持基于注解的行为映射,无XML文件扩展:Validation(jsr303),以及SLF4J日志生命周期方法/事件(LifecycleMethod/Event)支持可与Guice、Spring和其它DI框架很好整合或协作很多扩展点(新的注解,转换器,行为映射,日志等)不存储Null/Empty值(默认)GWT支持(实体仅为POJO)-(GWT忽略注释)允许原始类型、voidtoObject(DBObject)或DBObjectfromObject(Object)fromObject的高级映射器用mophia开发特征用mophia开发46Morphia开发环境配置从http:/ 中中Java 注解注解使用使用IdId注释指示Morphia哪个字段用作文档ID。如果试图持久保存对象(其Id注释的字段为null),则Morphia会自动生成ID值。EntityEntity注释是必需的。其声明了在专用MongoDB集合上该类作为文档将持久保存。在默认情况下,Morphia使用类名称来命名集合。例如:Entity(value=hotels,noClassnameStored=true)publicclassHotel.publicHotel().用mophia开发Morphia中Java注解使用用mophia开发48Entity其中noClassnameStored的意思是否保存classname,默认情况下保存的。但是一般情况下,我们不需要就不用保存。以下情况下需要保存:Entity(animals)abstractclassAnimalStringname;Entity(animals)CatextendsAnimal.Entity(animals)DogextendsAnimal.Listanimals=ds.createQuery(Animal.class).asList();用以区别是哪个子类。Entity(value=pps_bookmark,noClassnameStored=true,cap=CappedAt(0)在Entity中CappedAtcap()defaultCappedAt(0);用mophia开发Entity用mophia开发49Morphia 中中Java 注注释使用使用EmbeddedEmbedded注释说明Morphia将此对象实例嵌入到另一个对象中去。而不单独的放到一个MongoDB集合。例如:EmbeddedpublicclassEmbedEpisode/电视剧的剧集为嵌入式的ReferenceReference注释说明对象是对另外一个集合中的文档的引用。在从MongoDB集合中加载对象时,Morphia遵循着这些引用来建立对象关系。注意:在被引用之前必须已经保存到mongoDB中。ReferenceprivateListcategories;/分类用mophia开发Morphia中Java注释使用用mophia开发50Reference引用类型的不能用“.”操作子查询。比如:publicclassAssetInfoextendsMidEntityReferenceprivateShowTypeInfoshowTypeInfo;query.filter(“showTypeInfo.typeId=”,“MOVIE”);/是错误的。Cannotusedot-notationpast源码解释:/*ReturnsiftheMappedFieldisaReferenceorSerilized*/privatestaticbooleancanQueryPast(MappedFieldmf)return!(mf.hasAnnotation(Reference.class)|mf.hasAnnotation(Serialized.class);用mophia开发Reference用mophia开发51Morphia 中中Java 注注释使用使用Indexed类属性标记Indexed注释,表明为此属性增加索引。例如:IndexedprivateIntegersort;/排序Indexes&Index复合indexes可以指定多个字段,该注解是class级别。例如下面代码指定title为默认升序同时type为降序(-表示DESC)例如:Entity(value=pps_asset_info,noClassnameStored=true)Indexes(Index(value=title,-type,unique=true)publicclassAssetInfoextendsMidEntity用mophia开发Morphia中Java注释使用用mophia开发52Property类属性标记Property注释,表明为此属性在MongoDB数据库取一个别名。与ejb3-persistence,javax.persistence.Column同样的功能Column(name=description)例如:Property(my_integer)privateintmyInt;Transient类属性标记Transient注释则表明这个字段将不被持久化到数据库。用mophia开发Property用mophia开发53Morphia编程1、定义实体类EntityclassMyEntityIdObjectIdid;Stringname;用mophia开发Morphia编程用mophia开发54初始化初始化 Morphia/Mongo/连接到本地mongoDB数据库Mongomongo=newMongo(localhost);Morphiamorphia=newMorphia();/告诉Morphia映射哪些类morphia.mapPackage(MyPackage);/映射对象包/创建名为“myDB”数据库,mongo最好使用单实例模式Datastoreds=morphia.createDatastore(mongo,myDB);ds.ensureIndexes();/createsindexesfromIndexannotationsinyourentitiesds.ensureCaps();/createscappedcollectionsfromEntity,设置容量用mophia开发初始化Morphia/Mongo用mophia开发55保存被持久化类MyEntitye=.;ds.save(e);/将MyEntity对象持久化到mongoDB数据库中。查询/通过类型取的第一个数据项MyEntitye=ds.find(MyEntity.class).get();MyEntitye=ds.find(MyEntity.class).field(name).equal(someName).get();用mophia开发保存被持久化类用mophia开发56Datastore接口介绍Datastore接口把Java对象保存到MongoDB或从MongoDB中访问Java对象提供了安全类型的方法。它提供了get/find/save/delete方法为你操作Java对象。Get方法Get方法返回一个实体对象通过Id。get方法只是find(.)方法的一个精简版,通过ID访问。它会返回一个实体对象,或者null如果没有找到的话。Datastoreds=.Hotelhotel=ds.get(Hotel.class,hotelId);用mophia开发Datastore接口介绍用mophia开发57Find方法find方法只是对Query的一个轻量级的封装。作为封装它将返回一个Query,它实现Iterable和QueryResults接口。/在循环中使用for(Hotelhotel:ds.find(Hotel.class,stars,3)print(hotel);/作为一个List返回Listhotels=ds.find(Hotel.class,stars,3).asList();/对结果排序Listhotels=ds.find(Hotel.class,stars,3).sort(-stars).asList();/返回第一个符合条件的结果HotelgsHotel=ds.find(Hotel.class,name,GrandSierra).get();这里是有效的操作符列表=,=,!=,=,=,in,nin,all,size,exists。如果没有指定操作符默认使用=,就像上面的例子,=和“=”是等价的表示相等,!=和是等价的表示不相等。用mophia开发Find方法用mophia开发58Save方法大部分对MongoDB数据库操作的工作及Morphia映射解析工作已由Morphia完成。本方法直截了当,只要我们在定义持久化类时使用好Morphia注释即可。Hotelhotel=newHotel();ds.save(hotel);/Id属性如果没有指定的话,将被自动生成,ObjectIdid=hotel.getId();用mophia开发Save方法用mophia开发59Delete方法它已很好的自我解释,delete方法将从MongoDB数据库删除数据项,基于一个查询如id或其它条件。Datastoreds=./通过指定主键Id,删除数据项ds.delete(Hotel.class,newObjectId(GrandSierraResort);/基于一个查询,删除数据项ds.delete(ds.createQuery(Hotel.class).filter(pendingDelete,true);在morphia支持mongoDB以原子方式做一些操作的功能。如删除一个实体,并且同时返回要删除的项。FindAndDelete方法首先查询要删除的项,并且删除。Datastoreds=.HotelgrandSierra=ds.findAndDelete(ds.get(Hotel.class,newObjectId(GrandSierraResort);用mophia开发Delete方法用mophia开发60Update方法publicUpdateResultsupdate(Queryq,UpdateOperationsops)根据q查询出来要更新的数据;利用ops进行设置更新数据;Queryq=terminaDao.update(terminaDao.createQuery().field(“id”).equal(newObjectId(id);UpdateOperationsops=terminaDao.createUpdateOperations().set(“isConnection”,isConnection);terminaDao.update(q,ops);用mophia开发Update方法用mophia开发61创建索引和设置容量Morphiam=.Datastoreds=.m.map(MyEntity.class);ds.ensureIndexes();/createsalldefinedwithIndexedds.ensureCaps();/createsallcollectionsforEntity(cap=CappedAt(.)创建索引和设置容量。前面已经讲过CappedAt。用mophia开发创建索引和设置容量用mophia开发62查询Filter使用使用Datastoreds=.Queryq=ds.createQuery(MyEntity.class).filter(foo,12);between12and30wouldlooklikethis:Datastoreds=.Queryq=ds.createQuery(MyEntity.class).filter(foo,12).filter(foo,30);正则表达式:通过正则表达式来模糊查询。Patternpattern=Ppile(+treeIndex+.*$,Pattern.CASE_INSENSITIVE);categoryInfoDao.createQuery().filter(treeIndex,pattern).order(sort).asList();用mophia开发查询用mophia开发63Operators用mophia开发Mophia与mongo的对比表operatormongoop=$eq!=,$ne,=,=$gt,$lt,$gte,$ltein$innin$ninelem$elemMatchexists$existsall$allsize$sizeOperators用mophia开发Mophia与mong64Field方法方法Queryq=ds.createQuery(MyEntity.class).field(foo).equal(1);q.field(bar).greaterThan(12);.q.field(bar).lessThan(40);以下两种方式是一样的:Queryq=ds.createQuery(Person.class).field(addresses.city).equal(SanFrancisco);/orwithfilter,orwiththishelpermethodQueryq=ds.find(Person.class,addresses.city,SanFrancisco);用mophia开发Field方法用mophia开发65Field可以调用的方法methodoperationcommentexists$existsdoesNotExist$existsgreaterThan,greaterThanOrEq,lessThan,lessThanOrEq$gt,$gte,$lt,$lteequal,notEqual$eq,$nehasThisOne$eqhasAllOf$allhasAnyOf$inhasNoneOf$ninhasThisElement$elemMatchsizeEq$size用mophia开发Field可以调用的方法methodoperationc66Or操作操作Queryq=ad.createQuery(Person.class);q.or(q.criteria(firstName).equal(scott),q.criteria(lastName).equal(scott);用mophia开发Or操作用mophia开发67SortDatastoreds=.Queryq=ds.createQuery(MyEntity.class).filter(“foo”,12).order(“dateAdded”);/升序/descorder,降序Queryq=ds.createQuery(MyEntity.class).filter(foo,12).order(-dateAdded);升序前面没有符号;降序前面有“-”号./ascdateAdded,descfoo升降都有,Queryq=ds.createQuery(MyEntity.class).filter(foo,12).order(dateAdded,-foo);用mophia开发Sort用mophia开发68LimitDatastoreds=.Queryq=ds.createQuery(MyEntity.class).filter(foo,12).limit(100);Offset(skip)Datastoreds=.Queryq=ds.createQuery(MyEntity.class).filter(foo,12).offset(1000);以上的两个方法组合使用实现分页。例如:q.offset(page-1)*num).limit(num).asList();用mophia开发Limit用mophia开发69Ignoring FieldsDatastoreds=.MyEntitye=ds.createQuery(MyEntity.class).retrievedFields(true,“foo”).get();val=e.getFoo();/onlyfieldreturned如果为false则onlyfieldnotreturned。Thefieldnameargument(thelastarg)canbealistofstringsorastringarray:MyEntitye=ds.createQuery(MyEntity.class).retrievedFields(true,foo,bar).get();val=e.getFoo();/fieldsreturnedvak=e.getBar();/fieldsreturned用mophia开发IgnoringFields用mophia开发70Returning Data用mophia开发methoddoesget()returnsthefirstEntity-usinglimit(1)asList()returnallitemsinaList-couldbecostlywithlargeresultsetsReturningData用mophia开发method71了解SpringDataSpringData项目的目的是为了简化构建基于Spring框架应用的数据访问计数,包括非关系数据库、Map-Reduce框架、云数据服务等等;另外也包含对关系数据库的访问支持。SpringData包含多个子项目:Commons-提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化;Hadoop-基于Spring的Hadoop作业配置和一个POJO编程模型的MapReduce作业;Key-Value-集成了Redis和Riak,提供多个常用场景下的简单封装;Document-集成文档数据库:CouchDB和MongoDB并提供基本的配置映射和资料库支持;Graph-集成Neo4j提供强大的基于POJO的编程模型;GraphRooAddOn-RoosupportforNeo4j;JDBCExtensions-支持OracleRAD、高级队列和高级数据类型;JPA-简化创建JPA数据访问层和跨存储的持久层功能;Mapping-基于Grails的提供对象映射框架,支持不同的数据库;Examples-示例程序、文档和图数据库;Guidance-高级文档;用SpringData开发了解SpringData用SpringData开发72搭建环境在maven中需要添加以下依赖库:SpringDataMongoDB1.0.0.M2SpringCore3.0.5.RELEASEJavaMongoDriver2.5.2用SpringData开发搭建环境用SpringData开发73注解方式:Configurationpublic class MongoConfig extends AbstractMongoConfiguration private String getDatabaseName()return test;OverrideBeanpublic Mongo mongo()throws Exception return new Mongo(localhost);Overridepublic Bean MongoTemplate mongoTemplate()throws Exception return new MongoTemplate(mongo(),getDatabaseName();用SpringData开发注解方式:用SpringData开发74配置文件方式用SpringData开发配置文件方式用SpringData开发75public class App public static void main(String a)/注解ApplicationContextctx=new AnnotationConfigApplicationContext(MongoConfig.class);MongoOperationsmongoOperation=(MongoOperations)ctx.getBean(mongoTemplate);/配置文件ConfigurableApplicationContextcontext=new ClassPathXmlApplicationContext(classpath:/applicationContext.xml);MongoOperationsmongoOperations=(MongoOperations)context.getBean(mongoTemplate);用SpringData开发publicclassApp用SpringData开76增删改查/saveUseruser=newUser(5,beijing001,31);mongoOperation.save(user,user);/findUsersavedUser=mongoOperation.findOne(user,newQuery(Criteria
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!