MongDB從入門到精通_第1頁(yè)
MongDB從入門到精通_第2頁(yè)
MongDB從入門到精通_第3頁(yè)
MongDB從入門到精通_第4頁(yè)
MongDB從入門到精通_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 MongoDB 從入門到精通專題教程 By yunchow Blog: 最近有好多同事都在用mongodb,一個(gè)新的面向文檔型介于面向?qū)ο笈c關(guān)系型之間免費(fèi)的數(shù)據(jù)庫(kù),據(jù)說(shuō)有擁有比傳統(tǒng)數(shù)據(jù)庫(kù)更高的性能。趁今天早上有空,就研究了一下。 1,安裝并啟動(dòng)數(shù)據(jù)庫(kù) 進(jìn)入mongodb目錄,我們發(fā)現(xiàn)有如下目錄結(jié)構(gòu) |-mongodb |- bin |- mongo.exe|- mongod.exe .所以整個(gè)mongodb是非常簡(jiǎn)單的,以上列的也是我們最常用的命令,其它暫時(shí)不解釋。為了以后的操作方便,因此我們將當(dāng)前的bin目錄加入path,如果不會(huì)的可以百度Google?,F(xiàn)在打開(kāi)一個(gè)命令窗口,鍵入mongo

2、d,則窗口會(huì)提示數(shù)據(jù)庫(kù)啟動(dòng)失敗,如果你仔細(xì)看控制臺(tái)打出的消息,有如下這么一行:dbpath (/data/db/) does not exist, terminating目錄/data/db/是Linux下面的表示法,代表著數(shù)據(jù)庫(kù)默認(rèn)的數(shù)據(jù)文件目錄,而上面的提示的意思是說(shuō)數(shù)據(jù)庫(kù)目錄不存在,那么我們就在mongodb止錄下手動(dòng)建立一個(gè)目錄db,當(dāng)然此時(shí)屏幕上可能有些亂,這時(shí)可輸入cls進(jìn)行清屏操作。再輸入命令:mongodb -dbpath c:/mongodb/db,此時(shí)窗口打出幾行日志,然后處于等待狀態(tài)了,那么就表示數(shù)據(jù)庫(kù)啟動(dòng)成功了!當(dāng)然這個(gè)窗口不能關(guān)閉。2,登錄并操作數(shù)據(jù)庫(kù)(Shell方式

3、)2.1,連接打開(kāi)命令窗口,鍵入mongo,如果系統(tǒng)提示:connecting to: test,表示連接成功。2.2,查看所有庫(kù) 鍵入show dbs,則會(huì)顯示出當(dāng)前數(shù)據(jù)庫(kù)中所有的數(shù)據(jù)庫(kù)名稱。在mongodb里面是不用去手動(dòng)建立一個(gè)數(shù)據(jù)庫(kù)的,你只要直接使用就好,如果不存在數(shù)據(jù)庫(kù)引擎會(huì)幫我們創(chuàng)建他們。這一點(diǎn)與傳統(tǒng)數(shù)據(jù)庫(kù)相比有些不同。2.3,使用mydb鍵入use mydb,使用數(shù)據(jù)庫(kù)mydb,當(dāng)然mongodb會(huì)幫助我們自動(dòng)創(chuàng)建他們,當(dāng)然這個(gè)時(shí)候數(shù)據(jù)庫(kù)還是空的,可以通過(guò)輸入show dbs來(lái)確認(rèn)這一點(diǎn)。 2.4,新增記錄 2.5,查看集合當(dāng)中所有文檔 _id : ObjectId(4df220

4、1ac905b4e2a5f555cb), name : Rod, age : 30 此時(shí)發(fā)現(xiàn),在文檔的前面多了一列_id,這是自動(dòng)加進(jìn)去的,不用管他。 2.6,刪除記錄 2.6,保存多條記錄 來(lái)查看所有記錄。 2.7,迭代器的使用 查看余下的記錄。 在mongodb里可以將cursor當(dāng)成數(shù)組來(lái)使用,如下所示: printjson(cursor4); / 打印出第5條記錄 注意此種方式會(huì)將前N行全查出來(lái),所以對(duì)性能有較大影響。 2.8,根據(jù)條件查詢 現(xiàn)要查詢出y大于10的所有記錄: 其中$gt的意思就是“大于”,當(dāng)然讀者可推出其他N種表達(dá)。 2.9,查詢指定列 2.10,只查第一列 有的時(shí)候我

5、們只需要第一行的值,如果自己編程實(shí)現(xiàn)顯得有些麻煩,因此數(shù)據(jù)庫(kù)為我們 2.11,限制最大記錄從而提高性能 我們可以通過(guò)limit來(lái)限制查詢的最大行數(shù),如下: 2.12,修改記錄 3,MongoDB 數(shù)據(jù)結(jié)構(gòu) 4,利用java操作MongoDB 從官網(wǎng)下載java版本的驅(qū)動(dòng)并將其加入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 ); / 取得指定的庫(kù) 3.2,用戶認(rèn)證(可選) 在登錄數(shù)據(jù)庫(kù)時(shí),在數(shù)據(jù)庫(kù)啟動(dòng)時(shí)可以指定是否需要認(rèn)證(mongod -auth .), 此時(shí)連接時(shí)就需要用戶名和密碼(-serviceUser xx -servicePassword xx),如下: boolean auth = db.authenticate(myUserName, myPassword); 3.3,得到指定庫(kù)的所有集合 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)計(jì)集合中文檔的條數(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、() 有時(shí)個(gè)為了方便我們也可以寫成這種形式: query.put(i, new BasicDBObject($gt, 20).append($lte, 30); / i.e. 20 i = 30 3.11,創(chuàng)建一個(gè)索引 coll.createIndex(new BasicDBObject(i, 1); / create index on i, ascending 3.12,查詢集合中的索引列表 List list = coll.getIndexInfo(); 3.13,得到所有的庫(kù)名 Mongo m = new Mongo(); m.getDatabaseNames(); 3.14,刪除一個(gè)庫(kù)

10、 m.dropDatabase(my_new_db); 4,MongoDB類型與java類型 4.1,自動(dòng)成生主鍵 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)會(huì)被自動(dòng)包裝成二進(jìn)制類型。 4.6,時(shí)間 Times

12、tamp會(huì)被轉(zhuǎn)換成BSONTimestamp。 4.7,源代碼數(shù)據(jù) 源代碼數(shù)據(jù)代表了JavaScript代碼。CodeWScope類代表了這種數(shù)據(jù)。 5,高級(jí)操作部分 5.1,數(shù)據(jù)據(jù)安全 增加一個(gè)新的用戶:db.addUser(foo, bar); 刪除用戶:db.removeUser(foo); 為了提高查詢性能和安全性,也可增加只讀用戶:db.addUser(foo, bar, true); 此時(shí)雖然用戶已經(jīng)有了,但是怎么去測(cè)試是否生效了呢?先進(jìn)行認(rèn)證測(cè)試一下,如下: db.auth(foo, bar); 如果在服務(wù)端打出1則表示認(rèn)證通過(guò),客戶端可以使用了,如果是0表示不通過(guò) 那么在客戶端

13、可以通過(guò)如下代碼進(jìn)行認(rèn)證: db.authenticate(foo, bar.toCharArray(); 由此可知,所有的用戶信息是加在數(shù)據(jù)庫(kù)上面的,每個(gè)庫(kù)都有自己的用戶信息。 如此便可增加安全認(rèn)證功能了! 5.2,引用vs 內(nèi)嵌在關(guān)系型數(shù)據(jù)庫(kù)中,我們可以通過(guò)外鍵引用來(lái)表達(dá)一對(duì)多關(guān)聯(lián),建立中間表來(lái)表達(dá)多對(duì)多關(guān)聯(lián)。在MongoDB中卻沒(méi)有這種機(jī)制,我們可以通過(guò)對(duì)象的引用關(guān)系來(lái)實(shí)現(xiàn)這種關(guān)聯(lián),也可以把關(guān)聯(lián)的文檔內(nèi)嵌到文檔當(dāng)中。對(duì)于引用這種方式,我們可以通DBRef這個(gè)類進(jìn)行實(shí)現(xiàn)。那么在實(shí)際工作當(dāng)中,我們應(yīng)該選擇哪種存儲(chǔ)方式,有如下規(guī)則:1) 頂層對(duì)象應(yīng)該有自己的集合2) 明細(xì)對(duì)象應(yīng)該被嵌入父對(duì)象,

14、例如OrderDetail與Order3) 擁有包含關(guān)系的對(duì)易用應(yīng)該被嵌入4) 對(duì)于多對(duì)多關(guān)聯(lián)應(yīng)該使用數(shù)據(jù)庫(kù)引用5) 對(duì)于那種穩(wěn)定的比較小的集合可以在服務(wù)器端將其緩存起來(lái)從而提高性能6) 不能去引用一個(gè)嵌入的對(duì)象,至少目前還無(wú)法實(shí)現(xiàn)7) 我們很難去統(tǒng)計(jì)嵌入的對(duì)象8) 如果嵌入的對(duì)象太多太大會(huì)導(dǎo)致單個(gè)對(duì)象達(dá)到他的最大值9) 記住最后一條:如果遇到性能問(wèn)題,那么請(qǐng)使用嵌入方式進(jìn)行存儲(chǔ)5.3,數(shù)據(jù)庫(kù)優(yōu)化1)對(duì)于排序的字段,請(qǐng)加入索引現(xiàn)在根據(jù)y字段倒序顯示:,為了提高性能那么需要在字段y上加入索引這樣一來(lái),就可以根據(jù)索引排序,而不是直接查絢集合中的所有文檔。2)限制最大記錄數(shù):3)只查詢所需要的鍵,而

15、不是所有全查出來(lái):4)統(tǒng)計(jì)記錄條數(shù)利用count()方法:5)強(qiáng)制使用指定索引:5.4,高級(jí)查詢1)利用索引提高查詢速度 然后再查詢: 會(huì)有如下輸出: cursor : BtreeCursor x_1, nscanned : 19, nscannedObjects : 19, n : 19, millis : 0, nYields : 0, nChunkSkips : 0, isMultiKey : false, indexOnly : true, .其中indexOnly : true代表著此次查詢啟用了索引。一般的查詢不會(huì)利用索引,除非滿足以下條件,A) 必須列出要返回的字段名,這樣才能決定是否需要啟用索引B) 必須顯示的指出不顯示_id字段 _id : 02)利用“.”(點(diǎn)號(hào))進(jìn)行對(duì)象間

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論