Mongodb相關(guān)技術(shù)分享資料課件_第1頁
Mongodb相關(guān)技術(shù)分享資料課件_第2頁
Mongodb相關(guān)技術(shù)分享資料課件_第3頁
Mongodb相關(guān)技術(shù)分享資料課件_第4頁
Mongodb相關(guān)技術(shù)分享資料課件_第5頁
已閱讀5頁,還剩153頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

MongoDB相關(guān)技術(shù)徐如慶

2013-04-22MongoDB相關(guān)技術(shù)徐如慶1概念MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫。由C++語言編寫。旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案。MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點是它支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。MongoDB入門概念MongoDB入門2特點高性能、易部署、易使用,存儲數(shù)據(jù)非常方便。主要功能特性有:面向集合存儲,易存儲對象類型的數(shù)據(jù)。模式自由。使用高效的二進制數(shù)據(jù)存儲,包括大型對象(如視頻等)。支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++語言的驅(qū)動程序,社區(qū)中也提供了對Erlang及.NET等平臺的驅(qū)動程序。文件存儲格式為BSON(一種JSON的擴展)。MongoDB入門特點MongoDB入門3完整的索引支持:包括文檔內(nèi)嵌對象及數(shù)組。Mongo的查詢優(yōu)化器會分析查詢表達式,并生成一個高效的查詢計劃。查詢監(jiān)視:Mongo包含一個監(jiān)視工具用于分析數(shù)據(jù)庫操作的性能。http://IP:28017/復(fù)制及自動故障轉(zhuǎn)移:Mongo數(shù)據(jù)庫支持服務(wù)器之間的數(shù)據(jù)復(fù)制,支持主-從模式及服務(wù)器之間的相互復(fù)制。復(fù)制的主要目標是提供冗余及自動故障轉(zhuǎn)移。自動分片以支持云級別的伸縮性:自動分片功能支持水平的數(shù)據(jù)庫集群,可動態(tài)添加額外的機器。MongoDB入門完整的索引支持:包括文檔內(nèi)嵌對象及數(shù)組。Mongo的查詢優(yōu)化4適用場合網(wǎng)站數(shù)據(jù):Mongo非常適合實時的插入,更新與查詢,并具備網(wǎng)站實時數(shù)據(jù)存儲所需的復(fù)制及高度伸縮性。緩存:由于性能很高,Mongo也適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟之后,由Mongo搭建的持久化緩存層可以避免下層的數(shù)據(jù)源過載。大尺寸,低價值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫存儲一些數(shù)據(jù)時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統(tǒng)的文件進行存儲。高伸縮性的場景:Mongo非常適合由數(shù)十或數(shù)百臺服務(wù)器組成的數(shù)據(jù)庫。Mongo已經(jīng)包含對MapReduce引擎的內(nèi)置支持。用于對象及JSON數(shù)據(jù)的存儲:Mongo的BSON數(shù)據(jù)格式非常適合文檔化格式的存儲及查詢。MongoDB入門適用場合MongoDB入門5不適用場合高度事務(wù)性的系統(tǒng):例如銀行或會計系統(tǒng)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫目前還是更適用于需要大量原子性復(fù)雜事務(wù)的應(yīng)用程序。傳統(tǒng)的商業(yè)智能應(yīng)用:針對特定問題的BI數(shù)據(jù)庫會對產(chǎn)生高度優(yōu)化的查詢方式。對于此類應(yīng)用,數(shù)據(jù)倉庫可能是更合適的選擇。MongoDB入門不適用場合MongoDB入門6與mysql對比

傳統(tǒng)的關(guān)系數(shù)據(jù)庫一般由數(shù)據(jù)庫(database)、表(table)、記錄(record)三個層次概念組成。

MongoDB是由數(shù)據(jù)庫(database)、集合(collection)、文檔對象(document)三個層次組成。

集合相當于關(guān)系型數(shù)據(jù)庫里的表,但是集合中沒有列、行和關(guān)系概念,這體現(xiàn)了模式自由的特點。MongoDB入門與mysql對比MongoDB入門7下載下載地址:http:///downloads下載安裝包:官方下載地址←單擊此處,如果是win系統(tǒng),注意是64位還是32位版本的,請選擇正確的版本。MongoDB入門下載MongoDB入門8安裝與配置一、解壓縮文件。將壓縮包解壓,在D盤創(chuàng)建文件夾MongoDB,將壓縮包中所有的.exe文件拷到D:\MongoDB文件夾中。二、建立工作目錄1、建立數(shù)據(jù)存放目錄D:\mongodb\data2、建立日志文件

D:\mongodb\log\mongodb.log三、設(shè)置系統(tǒng)變量。為了方便從控制臺中管理mongodb.找到所有的exe的文件的路徑,此為D:\MongoDB\bin添加到path后面,添加之前加一個“;”;四、將mongdb作為windows服務(wù)隨機啟動控制臺中輸入:mongod--logpathD:\MongoDB\log\mongodb.log--logappend--dbpathD:\MongoDB\data--directoryperdb--serviceNamemongodb223--installMongoDB入門安裝與配置MongoDB入門9安裝與配置五、連接mongodb

在控制臺中輸入netstartmongodb223,會出現(xiàn)“MongoDB服務(wù)已經(jīng)啟動成功”的提示。停止:mongodb:netstopmongodb223輸入mongo,就會連接到test.在我的電腦--管理--服務(wù)和應(yīng)用程序中可以看到MongoDB服務(wù)已經(jīng)成功啟動MongoDB入門安裝與配置MongoDB入門10安裝與配置六、shell操作數(shù)據(jù)庫Win下輸入mongo.exe進入如下界面:MongoDB入門安裝與配置MongoDB入門11用戶與權(quán)限1、基于MongoDB的數(shù)據(jù)存儲沒有使用到權(quán)限訪問(MongoDB默認設(shè)置為無權(quán)限訪問限制)

2、可以通過注冊表修改啟動項添加--auth設(shè)置權(quán)限,設(shè)置權(quán)限后,需要驗證通過后才可以操作。注:設(shè)置權(quán)限后,需要重啟服務(wù)才有效。MongoDB入門用戶與權(quán)限MongoDB入門12用戶相關(guān)#增加或修改用戶密碼db.addUser('name','pwd')#查看用戶列表db.system.users.find()//admin權(quán)限#用戶認證db.auth('name','pwd')#刪除用戶db.removeUser('name')#查看所有用戶showusersMongoDB入門用戶相關(guān)MongoDB入門13普通操作新建集合集:db.createCollection("user");

刪除collectiondb.user.drop()刪除當前的數(shù)據(jù)庫db.dropDatabase()MongoDB操作普通操作MongoDB操作14增加數(shù)據(jù)db.user.insert({uid:1,username:"Falcon.C",age:25});varj={name:"mongo"};db.things.save(j);#存儲嵌套的對象db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]})#存儲數(shù)組對象db.user_addr.save({'Uid':'yushunzhi@','Al':['test-1@','test-2@']})

MongoDB操作增加數(shù)據(jù)MongoDB操作15更新數(shù)據(jù)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查詢內(nèi)where后面的

objNew:update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sqlupdate查詢內(nèi)set后面的

upsert:

這個參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。

multi:mongodb默認是false,只更新找到的第一條記錄,如果這個參數(shù)為true,就把按條件查出來多條記錄全部更新。MongoDB操作更新數(shù)據(jù)MongoDB操作16刪除數(shù)據(jù)#刪除yy=5的記錄db.foo.remove({'yy':5})

#刪除所有的記錄db.foo.remove()MongoDB操作刪除數(shù)據(jù)MongoDB操作17查詢#查找所有db.foo.find()#查找一條記錄db.foo.findOne()varmongo=db.things.findOne({name:"mongo"});>print(tojson(mongo));#根據(jù)條件檢索記錄db.things.find({name:"mongo"})#子對象的查找db.foo.find({'address.city':'beijing'})MongoDB操作查詢MongoDB操作18sort用法:>db.things.find({tags:'economy'}).sort({ts:-1}).limit(10);

1表示為以ts升序排序,若為-1,即為降序排序。等價于:SQL:select*fromthingswhere'economy'intagsorderbytsDESClimit10MongoDB操作sort用法:MongoDB操作19limit用法:db.things.find().limit(3);count操作:db.user_addr.count()distinctdb.foo.distinct('msg')MongoDB操作MongoDB操作20條件操作符$gt:>

$lt:<

$gte:>=

$lte:<=

$ne:!=、<>

$in:in

$nin:notin

$all:all

$not:反匹配#”>=”操作db.foo.find({"timestamp":{"$gte":2}})更多的在/manual/reference/operator/type/MongoDB操作條件操作符MongoDB操作21索引MongoDB提供了多樣性的索引支持,索引信息被保存在system.indexes中,且默認總是為_id創(chuàng)建索引,它的索引使用基本和MySQL等關(guān)系型數(shù)據(jù)庫一樣。其實可以這樣說,索引是凌駕于數(shù)據(jù)存儲系統(tǒng)之上的另一層系統(tǒng),所以各種結(jié)構(gòu)迥異的存儲都有相同或相似的索引實現(xiàn)及使用接口。MongoDB操作索引MongoDB操作22基礎(chǔ)索引在字段age上創(chuàng)建索引,1(升序);-1(降序):db.users.ensureIndex({age:1})_id是創(chuàng)建表的時候自動創(chuàng)建的索引,此索引是不能夠刪除的。當系統(tǒng)已有大量數(shù)據(jù)時,創(chuàng)建索引就是個非常耗時的活,我們可以在后臺執(zhí)行,只需指定“backgroud:true”即可。db.t3.ensureIndex({age:1},{backgroud:true})MongoDB操作基礎(chǔ)索引MongoDB操作23文檔索引

索引可以任何類型的字段,甚至文檔:db.factories.insert({name:"wwl",addr:{city:"Beijing",state:"BJ"}});

//在addr列上創(chuàng)建索引

db.factories.ensureIndex({addr:1});

//下面這個查詢將會用到我們剛剛建立的索引

db.factories.find({addr:{city:"Beijing",state:"BJ"}});

//但是下面這個查詢將不會用到索引,因為查詢的順序跟索引建立的順序不一樣

db.factories.find({addr:{state:"BJ",city:"Beijing"}});MongoDB操作文檔索引MongoDB操作24組合索引

跟其它數(shù)據(jù)庫產(chǎn)品一樣,MongoDB也是有組合索引的,下面我們將在addr.city和addr.state上建立組合索引。當創(chuàng)建組合索引時,字段后面的1表示升序,-1表示降序,是用1還是用-1主要是跟排序的時候或指定范圍內(nèi)查詢的時候有關(guān)的。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})MongoDB操作組合索引MongoDB操作25唯一索引只需在ensureIndex命令中指定”unique:true”即可創(chuàng)建唯一索引。例如,往表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})MongoDB操作唯一索引MongoDB操作26explain執(zhí)行計劃

MongoDB提供了一個explain命令讓我們獲知系統(tǒng)如何處理查詢請求。利用explain命令,我們可以很好地觀察系統(tǒng)如何使用索引來加快檢索,同時可以針對性優(yōu)化索引。MongoDB操作explain執(zhí)行計劃MongoDB操作27

db.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+308]

]

}

}MongoDB操作db.t5.ensureIndex({name:1})

28字段說明:cursor:返回游標類型(BasicCursor或BtreeCursor)nscanned:被掃描的文檔數(shù)量n:返回的文檔數(shù)量millis:耗時(毫秒)indexBounds:所使用的索引isMultiKey

:isaboolean.Whentrue,thequeryusesamultikeyindex,whereoneofthefieldsintheindexholdsanarray.nscannedObjects:Specifiesthetotalnumberofdocumentsscannedduringthequery.nYields:nYieldsisanumberthatreflectsthenumberoftimesthisqueryyieldedthereadlocktoallowwaitingwritesexecute.MongoDB操作字段說明:MongoDB操作29indexOnly:indexOnlyisabooleanvaluethatreturnstruewhenthequeryiscoveredbytheindexindicatedinthecursorfield.nChunkSkips:nChunkSkipsisanumberthatreflectsthenumberofdocumentsskippedbecauseofactivechunkmigrationsinashardedsystem.Typicallythiswillbezero.Anumbergreaterthanzeroisok,butindicatesalittlebitofinefficiency.更多參數(shù)講解:/manual/reference/explain/MongoDB操作indexOnly:indexOnlyisaboole30開啟profiling功能

有兩種方式可以控制Profiling的開關(guān)和級別,第一種是直接在啟動參數(shù)里直接進行設(shè)置。啟動MongoDB時加上–profile=級別即可。也可以在客戶端調(diào)用db.setProfilingLevel(級別)命令來實時配置,Profiler信息保存在file中。我們可以通過db.getProfilingLevel()命令來獲取當前的Profile級別,類似如下操作:db.setProfilingLevel(2);上面profile的級別可以取0,1,2三個值,他們表示的意義如下:0–不開啟1–記錄慢命令(默認為>100ms)2–記錄所有命令Profile記錄在級別1時會記錄慢命令,那么這個慢的定義是什么?上面我們說到其默認為100ms,當然有默認就有設(shè)置,其設(shè)置方法和級別一樣有兩種,一種是通過添加–slowms啟動參數(shù)配置。第二種是調(diào)用db.setProfilingLevel時加上第二個參數(shù):db.setProfilingLevel(level,slowms)

db.setProfilingLevel(1,10);MongoDB優(yōu)化開啟profiling功能MongoDB優(yōu)化31查詢Profiling記錄MongoDBProfile記錄是直接存在系統(tǒng)db里的,記錄位置file,所以,我們只要查詢這個Collection的記錄就可以獲取到我們的Profile記錄了。列出執(zhí)行時間長于某一限度(5ms)的Profile記錄:file.find({millis:{$gt:5}})MongoDBShell還提供了一個比較簡潔的命令showprofile,可列出最近5條執(zhí)行時間超過設(shè)定時間的

Profile記錄。MongoDB優(yōu)化查詢Profiling記錄MongoDB優(yōu)化32Mongo連接Mongomg=newMongo();無參數(shù)時,使用默認的。Host:127.0.01,port:27017Mongomg=newMongo("localhost");默認端口為:27017Mongomg=newMongo("localhost",27017);用mongoDB驅(qū)動直接開發(fā)Mongo連接用mongoDB驅(qū)動直接開發(fā)33獲取數(shù)據(jù)庫DBdb=mg.getDB("test");獲取名為test的數(shù)據(jù)庫。獲取數(shù)據(jù)庫表DBCollectionusers=db.getCollection("user");獲取test數(shù)據(jù)庫下的user表。用mongoDB驅(qū)動直接開發(fā)獲取數(shù)據(jù)庫用mongoDB驅(qū)動直接開發(fā)34插入數(shù)據(jù)

DBObjectuserObj=newBasicDBObject();#BasicDBObject實現(xiàn)BSONObject接口;userObj.put(“username”,“張三");userObj.put(“age",“20");users

.insert(userObj);用mongoDB驅(qū)動直接開發(fā)插入數(shù)據(jù)用mongoDB驅(qū)動直接開發(fā)35刪除數(shù)據(jù)DBObjectuserObj=newBasicDBObject(“username”,“張三");users.remove(userObj);用mongoDB驅(qū)動直接開發(fā)刪除數(shù)據(jù)用mongoDB驅(qū)動直接開發(fā)36修改數(shù)據(jù)DBObjectoldObj=newBasicDBObject(“username”,“張三");DBObjectnewObj=newBasicDBObject();newObj.put(“username”,“張三");newObj.put(“age",“80");users.

update(oldObj,newObj,true,false);參數(shù)說明:oldObj是update的查詢條件,類似sqlupdate查詢內(nèi)where后面的;objNew:update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sqlupdate查詢內(nèi)set后面的;upsert:如果不存在update的記錄,是否插入newObj,true為插入,默認是false,不插入。類似saveOrUptate

multi:mongodb默認是false,只更新找到的第一條記錄,如果這個參數(shù)為true,就把按條件查出來多條記錄全部更新。用mongoDB驅(qū)動直接開發(fā)修改數(shù)據(jù)用mongoDB驅(qū)動直接開發(fā)37查詢DBCollectionusers=db.getCollection("user");DBCursorcur=users.find();//

實現(xiàn)Iterator迭代器接口DBObjectobject=null;while(cur.hasNext()){object=cur.next();System.out.println(object);

//取出對象中列表為'username'和’age'的數(shù)據(jù)System.out.println("username:"+object.get(“username")+"\tupwd:"+object.get(“age")+"\t_id:"+object.get("_id"));

}用mongoDB驅(qū)動直接開發(fā)查詢用mongoDB驅(qū)動直接開發(fā)38查詢find()

Queriesforallobjectsinthiscollection.find(DBObjectref)

Queriesforanobjectinthiscollection.findAndModify(DBObjectquery,DBObjectupdate),找到更新

findAndRemove(DBObject

query),找到刪除findOne()獲取一條findOne(DBObjecto)獲取一條

Returnsasingleobjectfromthiscollectionmatchingthequery.getCount()返回總數(shù)。createIndex創(chuàng)建索引,getIndexInfo查詢索引,dropIndex刪除索引更多api說明:

/java/2.7.3/用mongoDB驅(qū)動直接開發(fā)查詢用mongoDB驅(qū)動直接開發(fā)39保持操作在同一個連接中執(zhí)行:在多個連接中使用。在com.mongodb.DB里有兩個重要的方法;requestStart()

startsanew"consistentrequest".requestDone()

endsthecurrent"consistentrequest“類似其他數(shù)據(jù)庫中在同一個事務(wù)里執(zhí)行。用mongoDB驅(qū)動直接開發(fā)保持操作在同一個連接中執(zhí)行:用mongoDB驅(qū)動直接開發(fā)40根據(jù)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驅(qū)動直接開發(fā)根據(jù)ObjectId查詢:用mongoDB驅(qū)動直接開發(fā)41NOT查詢BasicDBObjectquery=newBasicDBObject();BasicDBListcond=newBasicDBList();cond.add(value1);cond.add(value2);query.put("intData",newBasicDBObject("$nin",cond));coll.find(query).count());用mongoDB驅(qū)動直接開發(fā)NOT查詢用mongoDB驅(qū)動直接開發(fā)42查詢文檔部分列DBCursorcur=coll.find(newBasicDBObject(),newBasicDBObject("intData",true));查詢內(nèi)嵌文檔coll=getCollection("ParentColl");BasicDBObjectmap=newBasicDBObject();map.put("innertype","string1");map.put("innerContent","string0");DBCursorcur=coll.find(newBasicDBObject("documentData",map));

用mongoDB驅(qū)動直接開發(fā)查詢文檔部分列用mongoDB驅(qū)動直接開發(fā)43查詢內(nèi)嵌部分文檔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驅(qū)動直接開發(fā)查詢內(nèi)嵌部分文檔用mongoDB驅(qū)動直接開發(fā)44什么是Morphia

Morphia是一個開放源代碼的對象關(guān)系映射框架,它對MongoDB數(shù)據(jù)庫

java版驅(qū)動進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱MongoDB數(shù)據(jù)庫,也讓Java程序員可以從復(fù)雜數(shù)據(jù)庫設(shè)計中脫離出來,從而將更多的精力投入到業(yè)務(wù)邏輯中去。用mophia開發(fā)什么是Morphia用mophia開發(fā)45特征它易于使用,而且非常輕巧,每種類型使用一次反射。數(shù)據(jù)存儲(DataStore)和

DAO<T,V>

訪問抽象,或自己實現(xiàn)...使用運行時驗證的類型安全(Type-safe)和Fluent查詢(Query)支持基于注解的行為映射,無XML文件擴展:

Validation(jsr303)

,以及SLF4J日志生命周期方法/事件(LifecycleMethod/Event)支持可與Guice、Spring和其它DI框架很好整合或協(xié)作很多擴展點(新的注解,轉(zhuǎn)換器,行為映射,日志等)不存儲Null/Empty值(默認)GWT支持(實體僅為POJO)-(GWT忽略注釋)允許原始類型、voidtoObject(DBObject)或DBObject

fromObject(Object)

fromObject的高級映射器用mophia開發(fā)特征用mophia開發(fā)46Morphia開發(fā)環(huán)境配置

從/p/morphia/downloads/list下載Morphia開發(fā)包,直接include到lib庫。api路徑:/p/morphia/wiki/用mophia開發(fā)Morphia開發(fā)環(huán)境配置用mophia開發(fā)47Morphia中Java注解使用@Id@Id

注釋指示Morphia哪個字段用作文檔ID。如果試圖持久保存對象(其

@Id

注釋的字段為null),則Morphia會自動生成ID值。@Entity@Entity

注釋是必需的。其聲明了在專用MongoDB集合上該類作為文檔將持久保存。在默認情況下,Morphia使用類名稱來命名集合。例如:@Entity(value="hotels",noClassnameStored=true)

publicclassHotel{

...

publicHotel(){

}

...

}用mophia開發(fā)Morphia中Java注解使用用mophia開發(fā)48@Entity其中noClassnameStored的意思是否保存classname,默認情況下保存的。但是一般情況下,我們不需要就不用保存。以下情況下需要保存:@Entity("animals")abstractclassAnimal{Stringname;}

@Entity("animals")CatextendsAnimal{...}

@Entity("animals")DogextendsAnimal{...}

List<Animal>animals=ds.createQuery(Animal.class).asList();用以區(qū)別是哪個子類。@Entity(value="pps_bookmark",noClassnameStored=true,cap=@CappedAt(0))在@Entity中CappedAtcap()default@CappedAt(0);用mophia開發(fā)@Entity用mophia開發(fā)49Morphia中Java注釋使用@Embedded@Embedded注釋說明Morphia將此對象實例嵌入到另一個對象中去。而不單獨的放到一個MongoDB集合。例如:

@EmbeddedpublicclassEmbedEpisode//電視劇的劇集為嵌入式的@Reference@Reference

注釋說明對象是對另外一個集合中的文檔的引用。在從MongoDB集合中加載對象時,Morphia遵循著這些引用來建立對象關(guān)系。注意:在被引用之前必須已經(jīng)保存到mongoDB中。@ReferenceprivateList<CategoryInfo>categories;//分類用mophia開發(fā)Morphia中Java注釋使用用mophia開發(fā)50@Reference引用類型的不能用“.”操作子查詢。比如:publicclassAssetInfoextendsMidEntity{@ReferenceprivateShowTypeInfoshowTypeInfo;}query.filter(“showTypeInfo.typeId=”,“MOVIE”);//是錯誤的。Cannotusedot-notationpast源碼解釋:/**ReturnsiftheMappedFieldisaReferenceorSerilized*/privatestaticbooleancanQueryPast(MappedFieldmf){return!(mf.hasAnnotation(Reference.class)||mf.hasAnnotation(Serialized.class));}用mophia開發(fā)@Reference用mophia開發(fā)51Morphia中Java注釋使用@Indexed類屬性標記@Indexed注釋,表明為此屬性增加索引。例如:

@IndexedprivateIntegersort;//排序@

Indexes&@Index復(fù)合indexes可以指定多個字段,該注解是class級別。例如下面代碼指定title為默認升序同時type為降序(-表示DESC)例如:@Entity(value="pps_asset_info",noClassnameStored=true)@Indexes(@Index(value="title,-type",unique=true))publicclassAssetInfoextendsMidEntity{用mophia開發(fā)Morphia中Java注釋使用用mophia開發(fā)52@Property

類屬性標記@Property注釋,表明為此屬性在MongoDB數(shù)據(jù)庫取一個別名。與ejb3-persistence,javax.persistence.Column同樣的功能@Column(name="description")例如:@Property("my_integer")

privateintmyInt;@Transient

類屬性標記@Transient注釋則表明這個字段將不被持久化到數(shù)據(jù)庫。用mophia開發(fā)@Property用mophia開發(fā)53Morphia編程1、定義實體類@EntityclassMyEntity{

@IdObjectIdid;

Stringname;

}用mophia開發(fā)Morphia編程用mophia開發(fā)54初始化Morphia/Mongo//連接到本地mongoDB數(shù)據(jù)庫Mongomongo=newMongo("localhost");Morphiamorphia=newMorphia();//告訴Morphia映射哪些類morphia.mapPackage("MyPackage");

//映射對象包//創(chuàng)建名為“myDB”數(shù)據(jù)庫,mongo最好使用單實例模式Datastoreds=morphia.createDatastore(mongo,"myDB");ds.ensureIndexes();//createsindexesfrom@Indexannotationsinyourentities

ds.ensureCaps();//createscappedcollectionsfrom@Entity,設(shè)置容量用mophia開發(fā)初始化Morphia/Mongo用mophia開發(fā)55保存被持久化類MyEntitye=...;ds.save(e);//將MyEntity對象持久化到mongoDB數(shù)據(jù)庫中。查詢//通過類型取的第一個數(shù)據(jù)項MyEntitye=ds.find(MyEntity.class).get();MyEntitye=ds.find(MyEntity.class).field("name").equal("someName").get();用mophia開發(fā)保存被持久化類用mophia開發(fā)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開發(fā)Datastore接口介紹用mophia開發(fā)57Find方法

find方法只是對Query的一個輕量級的封裝。作為封裝它將返回一個Query,它實現(xiàn)Iterable<T>和QueryResults接口。

//在循環(huán)中使用for(Hotelhotel:ds.find(Hotel.class,"stars>",3))print(hotel);//作為一個List返回List<Hotel>hotels=ds.find(Hotel.class,"stars>",3).asList();//對結(jié)果排序List<Hotel>hotels=ds.find(Hotel.class,"stars>",3).sort("-stars").asList();//返回第一個符合條件的結(jié)果HotelgsHotel=ds.find(Hotel.class,"name","GrandSierra").get();這里是有效的操作符列表["=","==","!=","<>",">","<",">=","<=","in","nin","all","size","exists"]。如果沒有指定操作符默認使用"=",

就像上面的例子,"="和“==”是等價的表示相等,"!="和"<>"是等價的表示不相等。用mophia開發(fā)Find方法用mophia開發(fā)58Save方法

大部分對MongoDB數(shù)據(jù)庫操作的工作及Morphia映射解析工作已由Morphia完成。本方法直截了當,只要我們在定義持久化類時使用好Morphia注釋即可。Hotelhotel=newHotel();ds.save(hotel);//@Id屬性如果沒有指定的話,將被自動生成,ObjectIdid=hotel.getId();用mophia開發(fā)Save方法用mophia開發(fā)59

Delete方法

它已很好的自我解釋,delete方法將從MongoDB數(shù)據(jù)庫刪除數(shù)據(jù)項,基于一個查詢?nèi)鏸d或其它條件。Datastoreds=...//通過指定主鍵Id,刪除數(shù)據(jù)項ds.delete(Hotel.class,newObjectId("GrandSierraResort"));//基于一個查詢,刪除數(shù)據(jù)項ds.delete(ds.createQuery(Hotel.class).filter("pendingDelete",true));在morphia支持mongoDB以原子方式做一些操作的功能。如刪除一個實體,并且同時返回要刪除的項。

FindAndDelete方法首先查詢要刪除的項,并且刪除。Datastoreds=...

HotelgrandSierra=ds.findAndDelete(ds.get(Hotel.class,newObjectId("GrandSierraResort"));用mophia開發(fā)Delete方法用mophia開發(fā)60Update方法publicUpdateResults<T>update(Query<T>q,UpdateOperations<T>ops)根據(jù)q查詢出來要更新的數(shù)據(jù);利用ops進行設(shè)置更新數(shù)據(jù);Query<

Termina>q=terminaDao.update(terminaDao.createQuery().field(“id”).equal(newObjectId(id));UpdateOperations<Termina>ops=terminaDao.createUpdateOperations().set(“isConnection”,isConnection);terminaDao.update(q,ops);用mophia開發(fā)Update方法用mophia開發(fā)61創(chuàng)建索引和設(shè)置容量Morphiam=...

Datastoreds=...

m.map(MyEntity.class);

ds.ensureIndexes();//createsalldefinedwith@Indexed

ds.ensureCaps();//createsallcollectionsfor@Entity(cap=@CappedAt(...))創(chuàng)建索引和設(shè)置容量。前面已經(jīng)講過@CappedAt。用mophia開發(fā)創(chuàng)建索引和設(shè)置容量用mophia開發(fā)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開發(fā)查詢用mophia開發(fā)63Operators用mophia開發(fā)Mophia與mongo的對比表operatormongoop=$eq!=,<>$ne>,<,>=,<=$gt,$lt,$gte,$ltein$innin$ninelem$elemMatchexists$existsall$allsize$sizeOperators用mophia開發(fā)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,orwiththishelpermethod

Queryq=ds.find(Person.class,"addresses.city","SanFrancisco");用mophia開發(fā)Field方法用mophia開發(fā)65Field可以調(diào)用的方法methodoperationcommentexists$existsdoesNotExist$existsgreaterThan,greaterThanOrEq,lessThan,lessThanOrEq$gt,$gte,$lt,$lteequal,notEqual$eq,$nehasThisOne$eqhasAllOf$allhasAnyOf$inhasNoneOf$ninhasThisElement$elemMatchsizeEq$size用mophia開發(fā)Field可以調(diào)用的方法methodoperationc66Or操作Query<Person>q=ad.createQuery(Person.class);

q.or(

q.criteria("firstName").equal("scott"),

q.criteria("lastName").equal("scott")

);用mophia開發(fā)Or操作用mophia開發(fā)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開發(fā)Sort用mophia開發(fā)68LimitDatastoreds=...

Queryq=ds.createQuery(MyEntity.class).filter("foo>",12).limit(100);Offset(skip)Datastoreds=...

Queryq=ds.createQuery(MyEntity.class).filter("foo>",12).offset(1000);以上的兩個方法組合使用實現(xiàn)分頁。例如:q.offset((1)*num).limit(num).asList();用mophia開發(fā)Limit用mophia開發(fā)69IgnoringFieldsDatastoreds=...

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();//fieldsreturned

vak=e.getBar();//fieldsreturned用mophia開發(fā)IgnoringFields用mophia開發(fā)70ReturningData用mophia開發(fā)methoddoesget()returnsthefirstEntity--usinglimit(1)asList()returnallitemsinaList--couldbecostlywithlargeresultsetsReturningData用mophia開發(fā)method71了解SpringData

SpringData項目的目的是為了簡化構(gòu)建基于Spring框架應(yīng)用的數(shù)據(jù)訪問計數(shù),包括非關(guān)系數(shù)據(jù)庫、Map-Reduce框架、云數(shù)據(jù)服務(wù)等等;另外也包含對關(guān)系數(shù)據(jù)庫的訪問支持。SpringData包含多個子項目:Commons-提供共享的基礎(chǔ)框架,適合各個子項目使用,支持跨數(shù)據(jù)庫持久化;Hadoop-基于Spring的Hadoop作業(yè)配置和一個POJO編程模型的MapReduce作業(yè);Key-Value-集成了Redis和Riak,提供多個常用場景下的簡單封裝;Document-集成文檔數(shù)據(jù)庫:CouchDB和MongoDB并提供基本的配置映射和資料庫支持;Graph-集成Neo4j提供強大的基于POJO的編程模型;GraphRooAddOn-RoosupportforNeo4j;JDBCExtensions-支持OracleRAD、高級隊列和高級數(shù)據(jù)類型;JPA-簡化創(chuàng)建JPA數(shù)據(jù)訪問層和跨存儲的持久層功能;Mapping-基于Grails的提供對象映射框架,支持不同的數(shù)據(jù)庫;Examples-示例程序、文檔和圖數(shù)據(jù)庫;Guidance-高級文檔;用SpringData開發(fā)了解SpringData用SpringData開發(fā)72搭建環(huán)境在maven中需要添加以下依賴庫:SpringDataMongoDB–1.0.0.M2SpringCore–3.0.5.RELEASEJavaMongoDriver–2.5.2用SpringData開發(fā)搭建環(huán)境用SpringData開發(fā)73注解方式:@ConfigurationpublicclassMongoConfigextendsAbstractMongoConfiguration{privateStringgetDatabaseName(){return"test";}@Override@BeanpublicMongomongo()throwsException{returnnewMongo("localhost");}@Overridepublic@BeanMongoTemplatemongoTemplate()throwsException{returnnewMongoTemplate(mongo(),getDatabaseName());}用SpringData開發(fā)注解方式:用SpringData開發(fā)74配置文件方式<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:mongo="/schema/data/mongo"xsi:schemaLocation="/schema/context/schema/context/spring-context-3.0.xsd/schema/data/mongo/schema/data/mongo/spring-mongo-1.0.xsd/schema/beans/schema/beans/spring-beans-3.0.xsd">

<beanid="mongoTemplate"class="org.springframework.data.document.mongodb.MongoTemplate"><constructor-argname="mongo"ref="mongo"/><constructor-argname="databaseName"value="test"/></bean><mongo:mongohost="localhost"port="27017"/><context:annotation-config/></beans>用SpringData開發(fā)配置文件方式用SpringData開發(fā)75publicclassApp{publicstaticvoidmain(String[]a){//注解ApplicationContextctx=newAnnotationConfigApplicationContext(MongoConfig.class);MongoOperationsmongoOperation=(MongoOperations)ctx.getBean("mongoTemplate");//配置文件ConfigurableApplicationContextcontext=newClassPathXmlApplicationContext("classpath:/applicationContext.xml");MongoOperationsmongoOperations=(MongoOperations)context.getBean("mongoTemplate");}}用SpringData開發(fā)publicclassApp{用SpringData開76增刪改查//saveUseruser=newUser(5,"beijing001",31);mongoOperation.save("user",user);//findUsersavedUser=mongoOperation.findOne("user",newQuery(Criteria.where("uid").is(1)),User.class);System.out.println("savedUser:"+savedUser);//updatemongoOperation.updateFirst("user",newQuery(Criteria.where("uid").is("1")),Update.update("userName","newbeijing0002"));//delete

mongoOperation.remove("user",newQuery(Criteria.where("id").is("1001")),User.class);//findList<User>listUser=mongoOperation.getCollection("user",User.class);System.out.println("Numberofuser="+listUser.size());System.out.println(listUser.get(0).getAge());用SpringData開發(fā)增刪改查用SpringData開發(fā)77UpdateupdateFirst兩個的區(qū)別:帶String的是要指定表名,不帶的會讀取默認的設(shè)置,如果默認的設(shè)置沒有會報錯。updateMulti和updateFirst類似,只是它會更新所有符合條件的,而updateFirst只修改第一條;用SpringData開發(fā)Update用SpringData開發(fā)78謝謝大家!結(jié)束謝謝大家!結(jié)束79MongoDB相關(guān)技術(shù)徐如慶

2013-04-22MongoDB相關(guān)技術(shù)徐如慶80概念MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫。由C++語言編寫。旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案。MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點是它支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。MongoDB入門概念MongoDB入門81特點高性能、易部署、易使用,存儲數(shù)據(jù)非常方便。主要功能特性有:面向集合存儲,易存儲對象類型的數(shù)據(jù)。模式自由。使用高效的二進制數(shù)據(jù)存儲,包括大型對象(如視頻等)。支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++語言的驅(qū)動程序,社區(qū)中也提供了對Erlang及.NET等平臺的驅(qū)動程序。文件存儲格式為BSON(一種JSON的擴展)。MongoDB入門特點MongoDB入門82完整的索引支持:包括文檔內(nèi)嵌對象及數(shù)組。Mongo的查詢優(yōu)化器會分析查詢表達式,并生成一個高效的查詢計劃。查詢監(jiān)視:Mongo包含一個監(jiān)視工具用于分析數(shù)據(jù)庫操作的性能。http://IP:28017/復(fù)制及自動故障轉(zhuǎn)移:Mongo數(shù)據(jù)庫支持服務(wù)器之間的數(shù)據(jù)復(fù)制,支持主-從模式及服務(wù)器之間的相互復(fù)制。復(fù)制的主要目標是提供冗余及自動故障轉(zhuǎn)移。自動分片以支持云級別的伸縮性:自動分片功能支持水平的數(shù)據(jù)庫集群,可動態(tài)添加額外的機器。MongoDB入門完整的索引支持:包括文檔內(nèi)嵌對象及數(shù)組。Mongo的查詢優(yōu)化83適用場合網(wǎng)站數(shù)據(jù):Mongo非常適合實時的插入,更新與查詢,并具備網(wǎng)站實時數(shù)據(jù)存儲所需的復(fù)制及高度伸縮性。緩存:由于性能很高,Mongo也適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟之后,由Mongo搭建的持久化緩存層可以避免下層的數(shù)據(jù)源過載。大尺寸,低價值的數(shù)據(jù):使用傳

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論