




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 MongoDB 從入門到精通專題教程 By yunchow Blog: 最近有好多同事都在用mongodb,一個新的面向文檔型介于面向?qū)ο笈c關(guān)系型之間免費(fèi)的數(shù)據(jù)庫,據(jù)說有擁有比傳統(tǒng)數(shù)據(jù)庫更高的性能。趁今天早上有空,就研究了一下。 1,安裝并啟動數(shù)據(jù)庫 進(jìn)入mongodb目錄,我們發(fā)現(xiàn)有如下目錄結(jié)構(gòu) |-mongodb |- bin |- mongo.exe|- mongod.exe .所以整個mongodb是非常簡單的,以上列的也是我們最常用的命令,其它暫時不解釋。為了以后的操作方便,因此我們將當(dāng)前的bin目錄加入path,如果不會的可以百度Google?,F(xiàn)在打開一個命令窗口,鍵入mongo
2、d,則窗口會提示數(shù)據(jù)庫啟動失敗,如果你仔細(xì)看控制臺打出的消息,有如下這么一行:dbpath (/data/db/) does not exist, terminating目錄/data/db/是Linux下面的表示法,代表著數(shù)據(jù)庫默認(rèn)的數(shù)據(jù)文件目錄,而上面的提示的意思是說數(shù)據(jù)庫目錄不存在,那么我們就在mongodb止錄下手動建立一個目錄db,當(dāng)然此時屏幕上可能有些亂,這時可輸入cls進(jìn)行清屏操作。再輸入命令:mongodb -dbpath c:/mongodb/db,此時窗口打出幾行日志,然后處于等待狀態(tài)了,那么就表示數(shù)據(jù)庫啟動成功了!當(dāng)然這個窗口不能關(guān)閉。2,登錄并操作數(shù)據(jù)庫(Shell方式
3、)2.1,連接打開命令窗口,鍵入mongo,如果系統(tǒng)提示:connecting to: test,表示連接成功。2.2,查看所有庫 鍵入show dbs,則會顯示出當(dāng)前數(shù)據(jù)庫中所有的數(shù)據(jù)庫名稱。在mongodb里面是不用去手動建立一個數(shù)據(jù)庫的,你只要直接使用就好,如果不存在數(shù)據(jù)庫引擎會幫我們創(chuàng)建他們。這一點(diǎn)與傳統(tǒng)數(shù)據(jù)庫相比有些不同。2.3,使用mydb鍵入use mydb,使用數(shù)據(jù)庫mydb,當(dāng)然mongodb會幫助我們自動創(chuàng)建他們,當(dāng)然這個時候數(shù)據(jù)庫還是空的,可以通過輸入show dbs來確認(rèn)這一點(diǎn)。 2.4,新增記錄 2.5,查看集合當(dāng)中所有文檔 _id : ObjectId(4df220
4、1ac905b4e2a5f555cb), name : Rod, age : 30 此時發(fā)現(xiàn),在文檔的前面多了一列_id,這是自動加進(jìn)去的,不用管他。 2.6,刪除記錄 2.6,保存多條記錄 來查看所有記錄。 2.7,迭代器的使用 查看余下的記錄。 在mongodb里可以將cursor當(dāng)成數(shù)組來使用,如下所示: printjson(cursor4); / 打印出第5條記錄 注意此種方式會將前N行全查出來,所以對性能有較大影響。 2.8,根據(jù)條件查詢 現(xiàn)要查詢出y大于10的所有記錄: 其中$gt的意思就是“大于”,當(dāng)然讀者可推出其他N種表達(dá)。 2.9,查詢指定列 2.10,只查第一列 有的時候我
5、們只需要第一行的值,如果自己編程實(shí)現(xiàn)顯得有些麻煩,因此數(shù)據(jù)庫為我們 2.11,限制最大記錄從而提高性能 我們可以通過limit來限制查詢的最大行數(shù),如下: 2.12,修改記錄 3,MongoDB 數(shù)據(jù)結(jié)構(gòu) 4,利用java操作MongoDB 從官網(wǎng)下載java版本的驅(qū)動并將其加入classpath。 3.1,建立連接 Mongo m = new Mongo(); / 連接本地的27017端口 / or Mongo m = new Mongo( localhost ); / 默認(rèn)端口27017 / or Mongo m = new Mongo( localhost , 27017 ); / 指定
6、主機(jī)與端口 DB db = m.getDB( mydb ); / 取得指定的庫 3.2,用戶認(rèn)證(可選) 在登錄數(shù)據(jù)庫時,在數(shù)據(jù)庫啟動時可以指定是否需要認(rèn)證(mongod -auth .), 此時連接時就需要用戶名和密碼(-serviceUser xx -servicePassword xx),如下: boolean auth = db.authenticate(myUserName, myPassword); 3.3,得到指定庫的所有集合 Set colls = db.getCollectionNames(); for (String s : colls) 3.4,得到指定集合 DBColl
7、ection coll = db.getCollection(user); 3.5,插入文檔 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.6,查詢集合中的第一份文檔 DBObje
8、ct myDoc = coll.findOne(); 3.7,增加多份文檔 for (int i=0; i 100; i+) coll.insert(new BasicDBObject().append(i, i); 3.8,統(tǒng)計集合中文檔的條數(shù) 3.9,利用游標(biāo)得到所有記錄 DBCursor cur = coll.find(); while(cur.hasNext() 3.10,查詢指定文檔 BasicDBObject query = new BasicDBObject(); query.put(x, 8); cur = coll.find(query); while(cur.hasNext
9、() 有時個為了方便我們也可以寫成這種形式: query.put(i, new BasicDBObject($gt, 20).append($lte, 30); / i.e. 20 i = 30 3.11,創(chuàng)建一個索引 coll.createIndex(new BasicDBObject(i, 1); / create index on i, ascending 3.12,查詢集合中的索引列表 List list = coll.getIndexInfo(); 3.13,得到所有的庫名 Mongo m = new Mongo(); m.getDatabaseNames(); 3.14,刪除一個庫
10、 m.dropDatabase(my_new_db); 4,MongoDB類型與java類型 4.1,自動成生主鍵 ObjectId id = new ObjectId(); ObjectId copy = new ObjectId(id); 4.2,正則表達(dá)式的運(yùn)用 Pattern john = Ppile(joh?n, CASE_INSENSITIVE); BasicDBObject query = new BasicDBObject(name, john); / finds all people with name matching /joh?n/i DBCursor cursor =
11、collection.find(query); 4.3,日期類型 BasicDBObject time = new BasicDBObject(ts, now); collection.save(time); 4.4, 數(shù)組 ArrayList x = new ArrayList(); x.add(1); x.add(2); x.add(new BasicDBObject(foo, bar); x.add(4); BasicDBObject doc = new BasicDBObject(x, x); 4.5,二進(jìn)制數(shù)據(jù) 字節(jié)數(shù)組(byte)會被自動包裝成二進(jìn)制類型。 4.6,時間 Times
12、tamp會被轉(zhuǎn)換成BSONTimestamp。 4.7,源代碼數(shù)據(jù) 源代碼數(shù)據(jù)代表了JavaScript代碼。CodeWScope類代表了這種數(shù)據(jù)。 5,高級操作部分 5.1,數(shù)據(jù)據(jù)安全 增加一個新的用戶:db.addUser(foo, bar); 刪除用戶:db.removeUser(foo); 為了提高查詢性能和安全性,也可增加只讀用戶:db.addUser(foo, bar, true); 此時雖然用戶已經(jīng)有了,但是怎么去測試是否生效了呢?先進(jìn)行認(rèn)證測試一下,如下: db.auth(foo, bar); 如果在服務(wù)端打出1則表示認(rèn)證通過,客戶端可以使用了,如果是0表示不通過 那么在客戶端
13、可以通過如下代碼進(jìn)行認(rèn)證: db.authenticate(foo, bar.toCharArray(); 由此可知,所有的用戶信息是加在數(shù)據(jù)庫上面的,每個庫都有自己的用戶信息。 如此便可增加安全認(rèn)證功能了! 5.2,引用vs 內(nèi)嵌在關(guān)系型數(shù)據(jù)庫中,我們可以通過外鍵引用來表達(dá)一對多關(guān)聯(lián),建立中間表來表達(dá)多對多關(guān)聯(lián)。在MongoDB中卻沒有這種機(jī)制,我們可以通過對象的引用關(guān)系來實(shí)現(xiàn)這種關(guān)聯(lián),也可以把關(guān)聯(lián)的文檔內(nèi)嵌到文檔當(dāng)中。對于引用這種方式,我們可以通DBRef這個類進(jìn)行實(shí)現(xiàn)。那么在實(shí)際工作當(dāng)中,我們應(yīng)該選擇哪種存儲方式,有如下規(guī)則:1) 頂層對象應(yīng)該有自己的集合2) 明細(xì)對象應(yīng)該被嵌入父對象,
14、例如OrderDetail與Order3) 擁有包含關(guān)系的對易用應(yīng)該被嵌入4) 對于多對多關(guān)聯(lián)應(yīng)該使用數(shù)據(jù)庫引用5) 對于那種穩(wěn)定的比較小的集合可以在服務(wù)器端將其緩存起來從而提高性能6) 不能去引用一個嵌入的對象,至少目前還無法實(shí)現(xiàn)7) 我們很難去統(tǒng)計嵌入的對象8) 如果嵌入的對象太多太大會導(dǎo)致單個對象達(dá)到他的最大值9) 記住最后一條:如果遇到性能問題,那么請使用嵌入方式進(jìn)行存儲5.3,數(shù)據(jù)庫優(yōu)化1)對于排序的字段,請加入索引現(xiàn)在根據(jù)y字段倒序顯示:,為了提高性能那么需要在字段y上加入索引這樣一來,就可以根據(jù)索引排序,而不是直接查絢集合中的所有文檔。2)限制最大記錄數(shù):3)只查詢所需要的鍵,而
15、不是所有全查出來:4)統(tǒng)計記錄條數(shù)利用count()方法:5)強(qiáng)制使用指定索引:5.4,高級查詢1)利用索引提高查詢速度 然后再查詢: 會有如下輸出: cursor : BtreeCursor x_1, nscanned : 19, nscannedObjects : 19, n : 19, millis : 0, nYields : 0, nChunkSkips : 0, isMultiKey : false, indexOnly : true, .其中indexOnly : true代表著此次查詢啟用了索引。一般的查詢不會利用索引,除非滿足以下條件,A) 必須列出要返回的字段名,這樣才能決定是否需要啟用索引B) 必須顯示的指出不顯示_id字段 _id : 02)利用“.”(點(diǎn)號)進(jìn)行對象間
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 礦山場地承包合作協(xié)議
- 大學(xué)論文考試題庫及答案
- 美術(shù)課件創(chuàng)意畫小學(xué)生
- 美術(shù)兒童雕塑課件
- 民航安全生產(chǎn)法律法規(guī)的內(nèi)容
- 美術(shù)兒童素描課件
- 食品安全生產(chǎn)許可證在哪個部門辦理
- 食堂安全管理方案
- 美國景點(diǎn)介紹課件
- 2025至2030中國聚對苯二甲酸乙二酯樹脂行業(yè)項目調(diào)研及市場前景預(yù)測評估報告
- 2024年F段歷史投檔分?jǐn)?shù)線
- 國家漢語主題詞表
- 國家開放大學(xué)??啤稒C(jī)械制圖》形考任務(wù)1-4試題及答案
- DB34∕T 4004-2021 埋地聚乙烯燃?xì)夤艿蓝ㄆ跈z驗規(guī)則
- 裝修代賣合同范本
- 高大模板安全施工施工方法及工藝要求
- 車庫業(yè)主與租賃者安裝充電樁協(xié)議書
- 臺球廳桌球俱樂部創(chuàng)業(yè)計劃書課件模板
- 醫(yī)務(wù)人員技術(shù)檔案
- 人工智能創(chuàng)業(yè)項目計劃書
- 2023年鐵嶺市三支一扶筆試真題
評論
0/150
提交評論