NoSql數(shù)據(jù)庫(kù)mongodb應(yīng)用說(shuō)明_第1頁(yè)
NoSql數(shù)據(jù)庫(kù)mongodb應(yīng)用說(shuō)明_第2頁(yè)
NoSql數(shù)據(jù)庫(kù)mongodb應(yīng)用說(shuō)明_第3頁(yè)
NoSql數(shù)據(jù)庫(kù)mongodb應(yīng)用說(shuō)明_第4頁(yè)
NoSql數(shù)據(jù)庫(kù)mongodb應(yīng)用說(shuō)明_第5頁(yè)
已閱讀5頁(yè),還剩20頁(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、NoSql數(shù)據(jù)庫(kù)MongoDB應(yīng)用說(shuō)明中科軟科技股份有限公司技術(shù)組2011年 6月關(guān)于本文檔主 題NoSql數(shù)據(jù)庫(kù)mongodb應(yīng)用說(shuō)明說(shuō)明將理論中的NoSql數(shù)據(jù)庫(kù)提升到應(yīng)用的層面適用對(duì)象修 訂 歷 史版 本章 節(jié)類 型日 期作 者說(shuō) 明V1.0全部C2011-06-13姚春陽(yáng)創(chuàng)建說(shuō)明:類型創(chuàng)建(C)、修改(U)、刪除(D)、增加(A);評(píng) 審 記 錄 角 色簽 名日 期說(shuō) 明目 錄1.前言51.1.目的51.2.范圍61.3.名詞和縮略語(yǔ)61.4.參考文檔62.Mongodb72.1.簡(jiǎn)介72.2.特點(diǎn)72.3.使用原理82.4.安裝92.4.1.Linux/Unix/OS X下92.4.

2、2.Windows下102.4.3.基本命令102.4.4.常用語(yǔ)法113.Mongodb應(yīng)用123.1.查詢123.1.1.條件操作符123.1.2.查詢舉例123.2.MongoDB之GridFS173.3.數(shù)據(jù)復(fù)制、自動(dòng)分片173.4.Java程序簡(jiǎn)要用法183.4.1.建立連接183.4.2.安全驗(yàn)證(非必選)193.4.3.獲取集合列表193.4.4.獲得一個(gè)集合193.4.5.插入文檔203.4.6.使用findOne()查找集合中第一個(gè)文檔203.4.7.加入多種文檔213.4.8.統(tǒng)計(jì)文檔數(shù)量223.4.9.使用光標(biāo)(cursor)來(lái)獲取全部文檔223.4.10.在查詢中獲取單

3、一文檔223.4.11.使用條件查詢獲取集合223.4.12.創(chuàng)建索引233.4.13.獲取索引列表233.4.14.MongoDB管理函數(shù)233.4.15.用DBObject存儲(chǔ)JAVA對(duì)象243.4.16.JAVA驅(qū)動(dòng)的并發(fā)性254.附錄:附件文件251. 前言隨著越來(lái)越多的個(gè)性化應(yīng)用需求及業(yè)務(wù)需求的提出,傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)在寫入和查詢上不斷出現(xiàn)瓶頸,導(dǎo)致我們的業(yè)務(wù)應(yīng)用在某些功能點(diǎn)上由于關(guān)系型數(shù)據(jù)庫(kù)的寫入和查詢效率問(wèn)題造成了非常大的性能瓶頸,而內(nèi)存緩存的使用又無(wú)法做到一些業(yè)務(wù)數(shù)據(jù)的持久化導(dǎo)致緩存應(yīng)用僅能將一些非必要的代碼數(shù)據(jù)暫時(shí)放入緩存,而應(yīng)用服務(wù)一旦宕機(jī)或重啟將無(wú)法維持使用需要重新載入。N

4、oSql非關(guān)系型數(shù)據(jù)庫(kù)不但能夠解決數(shù)據(jù)持久化的問(wèn)題,從設(shè)計(jì)上完全建立在針對(duì)利用高性能閃存之上,解決了傳統(tǒng)緩存的持久化問(wèn)題。從數(shù)據(jù)庫(kù)角度來(lái)講NoSql數(shù)據(jù)庫(kù)雖然無(wú)法滿足嚴(yán)格的事物處理需求,但作為緩存以及實(shí)時(shí)的非事物性數(shù)據(jù)的存儲(chǔ)設(shè)備卻完全體現(xiàn)了其高速、可靠以及擴(kuò)展的各種性能需求。1.1. 目的在各種各樣的業(yè)務(wù)系統(tǒng)中,我們習(xí)慣性的使用java的Map來(lái)充當(dāng)緩存,但Map在應(yīng)用中的生命期是與業(yè)務(wù)應(yīng)用相同的,也就是一旦宕機(jī)將失去Map中所有數(shù)據(jù),而且保存在Map中的數(shù)據(jù)屬于在java所開(kāi)辟的內(nèi)存中,當(dāng)數(shù)據(jù)不斷寫入的同時(shí)擠占了java進(jìn)程的內(nèi)存空間同時(shí)不方便管理內(nèi)存中數(shù)據(jù),而引入NoSql數(shù)據(jù)庫(kù)將解決以上

5、所有問(wèn)題。為什么我們要引入NoSql:1、 High performance - 對(duì)數(shù)據(jù)庫(kù)高并發(fā)讀寫的需求在業(yè)務(wù)應(yīng)用生產(chǎn)環(huán)境中根據(jù)不同公司的業(yè)務(wù)量會(huì)對(duì)我們的應(yīng)用系統(tǒng)有著不同的并發(fā)訪問(wèn)需求,高并發(fā)訪問(wèn)業(yè)務(wù)系統(tǒng)并處理業(yè)務(wù)數(shù)據(jù)時(shí)數(shù)據(jù)庫(kù)并發(fā)負(fù)載非常高,往往要達(dá)到每秒上萬(wàn)次讀寫請(qǐng)求。關(guān)系數(shù)據(jù)庫(kù)應(yīng)付上萬(wàn)次SQL查詢還勉強(qiáng)頂?shù)米?,但是?yīng)付上萬(wàn)次SQL寫數(shù)據(jù)請(qǐng)求,硬盤IO就已經(jīng)無(wú)法承受了,由此瓶頸出現(xiàn)在硬件讀寫速度上。2、 Huge Storage - 對(duì)海量數(shù)據(jù)的高效率存儲(chǔ)和訪問(wèn)的需求以影像系統(tǒng)為例,隨著業(yè)務(wù)量的不斷遞增,我們的影像數(shù)據(jù)索引表中的內(nèi)容會(huì)與日俱增,而此表會(huì)在日常業(yè)務(wù)應(yīng)用中不斷寫入和查詢,高數(shù)據(jù)

6、量的數(shù)據(jù)表在檢索時(shí)雖然可以采用索引進(jìn)行檢索,但實(shí)際情況證明即使使用了相關(guān)索引查詢某業(yè)務(wù)下的影像數(shù)據(jù)時(shí)由于數(shù)據(jù)趨于海量其檢索速度并不樂(lè)觀,目前對(duì)該表的可行性優(yōu)化即根據(jù)日期條件進(jìn)行分表處理,但此操作需要過(guò)多人工干預(yù)無(wú)法實(shí)現(xiàn)完全自動(dòng)化。另外的一個(gè)非常突出的案例就是各種接口日志以及系統(tǒng)異常日志的存儲(chǔ)問(wèn)題。3、 High Scalability & High Availability- 對(duì)數(shù)據(jù)庫(kù)的高可擴(kuò)展性和高可用性的需求對(duì)于數(shù)據(jù)庫(kù)的橫向擴(kuò)展問(wèn)題應(yīng)該不需多說(shuō)了,傳統(tǒng)數(shù)據(jù)庫(kù)(oracle、informix等)在橫向擴(kuò)展性方面都存在很大的不足,而目前NoSql中的mongodb則做到了完全意義上的水平擴(kuò)展。

7、包括容量擴(kuò)展完全可采用價(jià)格低廉的設(shè)備中進(jìn)行。1.2. 范圍本次簡(jiǎn)要描述NoSql數(shù)據(jù)庫(kù)產(chǎn)品家族中的mongodb的安裝及使用,為個(gè)項(xiàng)目組技術(shù)人員增加性能優(yōu)化思路。1.3. 名詞和縮略語(yǔ)名詞及縮略語(yǔ)解釋技術(shù)層術(shù)語(yǔ)NoSqlNoSQL(NoSQL = Not Only SQL ),指的是非關(guān)系型的數(shù)據(jù)庫(kù)。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)在應(yīng)付web2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的SNS類型的web2.0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問(wèn)題,而非關(guān)系型的數(shù)據(jù)庫(kù)則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展。mongodb MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù).

8、由C+語(yǔ)言編寫.旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案.1.4. 參考文檔文檔名說(shuō)明2. Mongodb2.1. 簡(jiǎn)介MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù).由C+語(yǔ)言編寫.旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。2.2. 特點(diǎn)它的特點(diǎn)是高性能、易部署、易使用,存儲(chǔ)數(shù)據(jù)非常方便。主要功能特性有:n 面向集合存儲(chǔ),易存儲(chǔ)對(duì)象類型的數(shù)據(jù)。 n 模式自由。n 支持動(dòng)態(tài)查詢。 n 支持完全索引,包含內(nèi)部對(duì)象。 n 支持查詢。 n 支持復(fù)制和故障恢復(fù)。 n 使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ),包括大型對(duì)象(如視頻等)。n 自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展性n 支持RUBY,PY

9、THON,JAVA,C+,PHP等多種語(yǔ)言。n 文件存儲(chǔ)格式為BSON(一種JSON的擴(kuò)展)n 可通過(guò)網(wǎng)絡(luò)訪問(wèn)。適用場(chǎng)景:n 適合作為信息基礎(chǔ)設(shè)施的持久化緩存層 。n 適合實(shí)時(shí)的插入,更新與查詢,并具備應(yīng)用程序?qū)崟r(shí)數(shù)據(jù)存儲(chǔ)所需的復(fù)制及高度伸縮性。n Mongo的BSON數(shù)據(jù)格式非常適合文檔化格式的存儲(chǔ)及查詢 。n 適合由數(shù)十或數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫(kù)。因?yàn)镸ongo已經(jīng)包含了對(duì)MapReduce引擎的內(nèi)置支持。不適用場(chǎng)景:n 要求高度事務(wù)性的系統(tǒng)。n 傳統(tǒng)的商業(yè)智能應(yīng)用。n 復(fù)雜的跨文檔(表)級(jí)聯(lián)查詢。2.3. 使用原理所謂“面向集合”(Collenction-Oriented),意思是數(shù)據(jù)被

10、分組存儲(chǔ)在數(shù)據(jù)集中,被稱為一個(gè)集合(Collenction)。每個(gè)集合在數(shù)據(jù)庫(kù)中都有一個(gè)唯一的標(biāo)識(shí)名,并且可以包含無(wú)限數(shù)目的文檔。集合的概念類似關(guān)系型數(shù)據(jù)庫(kù)(RDBMS)里的表(table),不同的是它不需要定義任何模式(schema)。 模式自由(schema-free),意味著對(duì)于存儲(chǔ)在mongodb數(shù)據(jù)庫(kù)中的文件,我們不需要知道它的任何結(jié)構(gòu)定義。如果需要的話,你完全可以把不同結(jié)構(gòu)的文件存儲(chǔ)在同一個(gè)數(shù)據(jù)庫(kù)里。 存儲(chǔ)在集合中的文檔,被存儲(chǔ)為鍵-值對(duì)的形式。鍵用于唯一標(biāo)識(shí)一個(gè)文檔,為字符串類型,而值則可以是各種復(fù)雜的文件類型。我們稱這種存儲(chǔ)形式為BSON(Binary Serialized d

11、Ocument Format)。MongoDB服務(wù)端可運(yùn)行在Linux、Windows或OS X平臺(tái),支持32位和64位應(yīng)用,默認(rèn)端口為27017。推薦運(yùn)行在64位平臺(tái),因?yàn)镸ongoDB在32位模式運(yùn)行時(shí)支持的最大文件尺寸為2GB。工作方式: MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富并且最像關(guān)系型數(shù)據(jù)庫(kù)。 傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)一般由數(shù)據(jù)庫(kù)(database)、表(table)、記錄(record)三個(gè)層次概念組成,MongoDB同樣也是由數(shù)據(jù)庫(kù)(database) 、集合(collection)、文檔對(duì)象(document)三個(gè)層次組成。 Mong

12、oDB里的集合對(duì)應(yīng)于關(guān)系型數(shù)據(jù)庫(kù)里的表,但是集合中沒(méi)有列、行和關(guān)系的概念,這體現(xiàn)了模式自由的特點(diǎn)。 在MongoDB中數(shù)據(jù)以單文檔為單位存儲(chǔ),這樣就能在單個(gè)數(shù)據(jù)對(duì)象中表示復(fù)雜的關(guān)系。文檔可以由獨(dú)立的基本類型屬性、內(nèi)嵌文檔或文檔數(shù)組組成。 MongoDB存儲(chǔ)的數(shù)據(jù)格式是key-value對(duì)的集合,鍵是字符串,值可以是數(shù)據(jù)類型集合里的任意類型,包括數(shù)組和文檔對(duì)象。這種數(shù)據(jù)格式稱作 BSON,即 “Binary Serialized Document Notation”,是一種類似JSON的二進(jìn)制序列化文檔 。 MongoDB是一個(gè)免安裝的數(shù)據(jù)庫(kù),將它解壓后生成一個(gè)bin目錄(v1.6) ,其中包含

13、10個(gè)可執(zhí)行文件,除此之外不再需要任何其它的二進(jìn)制依賴文件。 通常情況下啟動(dòng)數(shù)據(jù)庫(kù)只需要關(guān)注其中的兩個(gè)可執(zhí)行文件:mongod.exe和mongo.exe。前者是MongoDB數(shù)據(jù)庫(kù)進(jìn)程本身,是核心數(shù)據(jù)庫(kù)服務(wù)器,后者是命令行Shell客戶端,其使用方法通常類似于MySQL命令行Shell客戶端,用于確保所有內(nèi)容都已正常安裝且能正常運(yùn)行,并且可以對(duì)數(shù)據(jù)進(jìn)行CRUD操作、執(zhí)行管理任務(wù)等等。 MongoDB使用了內(nèi)存映射文件進(jìn)行數(shù)據(jù)管理,把所有空閑內(nèi)存當(dāng)緩存使用,且不能指定內(nèi)存大小。這既是優(yōu)點(diǎn)也是缺點(diǎn):優(yōu)點(diǎn)-可以最大限度提升性能;缺點(diǎn)-容易受其它程序干擾。 數(shù)據(jù)空間采用預(yù)分配,目的是為了避免形成過(guò)多

14、的硬盤碎片。它為每個(gè)數(shù)據(jù)庫(kù)分配一系列文件,每個(gè)數(shù)據(jù)文件都會(huì)被預(yù)分配一個(gè)大小,第一個(gè)文件名字為“.0 ” ,大小為64MB,第二個(gè)文件“.1”為128MB ,依此類推,在32位模式運(yùn)行時(shí)支持的最大文件為2GB。隨著數(shù)據(jù)量的增加,可以在其數(shù)據(jù)目錄里看到這些不斷遞增的文件。 MongoDB沒(méi)有自動(dòng)遞增或序列特性,當(dāng)BSON對(duì)象插入到數(shù)據(jù)庫(kù)中時(shí),如果沒(méi)有提供“_id”字段 ,數(shù)據(jù)庫(kù)會(huì)自動(dòng)生成一個(gè)ObjectId對(duì)象作為“_id”的值插入到集合中作為該文檔的主鍵(這就避免了其它數(shù)據(jù)庫(kù)意外地選擇相同的惟一標(biāo)識(shí)符的情況) ,“_id”的值由4字節(jié)的時(shí)間戳,3字節(jié)的機(jī)器號(hào),2字節(jié)的進(jìn)程id以及3字節(jié)的自增計(jì)數(shù)

15、組成。當(dāng)然字段“_id”的值可以手動(dòng)生成(任意類型都可),只要能夠保證惟一性。 每個(gè)插入的BSON對(duì)象大小不能超過(guò)4MB,如果超過(guò)4M時(shí)需使用 GridFS來(lái)儲(chǔ)存數(shù)據(jù)。 刪除記錄后不會(huì)釋放已分配的空間,換句話說(shuō):原記錄空間不刪除。2.4. 安裝2.4.1. Linux/Unix/OS X下1、建立數(shù)據(jù)目錄mkdir -p /data/db2、下載壓縮包c(diǎn)url -O/linux/mongodb-linux-i686-latest.tgz或下載安裝包后上傳至服務(wù)器3、解壓縮文件tar xzf mongodb-linux-i386-latest

16、.tgz4、啟動(dòng)服務(wù)bin/mongod run &5、使用自帶客戶端連接/bin/mongo6、測(cè)試db.foo.save( a : 1 )db.foo.findOne()2.4.2. Windows下1、建立數(shù)據(jù)目錄c:datadb2、下載壓縮包,解壓文件3、啟動(dòng)服務(wù)binmongod.exe run4、自帶客戶端binmongon.exe在LINUX和WINDOWS系統(tǒng)下的使用大同小異,不同的地方主要是默認(rèn)的數(shù)據(jù)存儲(chǔ)目錄。LINUX類系統(tǒng)下存放在/data/db下,而WINDOWS會(huì)存放在C:datadb下??梢栽趩?dòng)時(shí)使用-dbpath參數(shù)指定存儲(chǔ)目錄并啟動(dòng)。如:binmongod.e

17、xe -dbpath d:datamongo2.4.3. 基本命令1、啟動(dòng)命令n mongod 啟動(dòng)數(shù)據(jù)庫(kù)進(jìn)程n -dbpath 指定數(shù)據(jù)庫(kù)的目錄n -port 指定數(shù)據(jù)庫(kù)的端口,默認(rèn)是27017n -bind_ip 綁定IPn -directoryperdb為每個(gè)db創(chuàng)建一個(gè)獨(dú)立子目錄n -logpath指定日志存放目錄n -logappend指定日志生成方式(追加/覆蓋)n 例如:mongod -dbpath db -port 27098-directoryperdb -logpath dblogsmongodb.log logappend2、停止服務(wù)關(guān)閉數(shù)據(jù)有兩種方式:n 在窗口模式中,

18、可以直接使用Ctrl+C停止服務(wù)n 通過(guò)mongo連接至客戶端,并使用db.shutdownServer()停止服務(wù)。3、其它命令n show dbs / 列出所有數(shù)據(jù)庫(kù)n use test / 使用數(shù)據(jù)庫(kù)test ,即使這個(gè)數(shù)據(jù)庫(kù)不存在也可以執(zhí)行,但該數(shù)據(jù)庫(kù)不會(huì)立刻被新建,要等到執(zhí)行了insert之類的操作時(shí),才會(huì)建立這個(gè)數(shù)據(jù)庫(kù)n show collections / 列出當(dāng)前數(shù)據(jù)庫(kù)的所有文檔n db / 顯示當(dāng)前數(shù)據(jù)庫(kù)n show users / 列出用戶n 4、幫助命令n 想知道m(xù)ongodb支持哪些命令,可以直接輸入help、如果想知道當(dāng)前數(shù)據(jù)庫(kù)支持哪些方法,可以使用db.help()

19、命令、如果想知道當(dāng)前數(shù)據(jù)庫(kù)下的表或者表collection支持哪些方法,可以使用命令db.dbname.help()。2.4.4. 常用語(yǔ)法1、連接數(shù)據(jù)庫(kù)、創(chuàng)建數(shù)據(jù)集n 使用mongo命令可以連接到數(shù)據(jù)庫(kù)中,默認(rèn)是連接到test的數(shù)據(jù)庫(kù)。n 使用db.createCollection(“mycoll”),或db.createCollection(“mycoll”, size :100 , capped :true, max :1000 )創(chuàng)建數(shù)據(jù)集。2、添加操作n 添加普通數(shù)據(jù)使用db.collname.insert或db.collname.save(.)命令3、修改操作n 修改普通數(shù)據(jù)使用d

20、b.collname.update()4、查詢操作n 查詢數(shù)據(jù)使用db.collname.find()n MongoDB的查詢語(yǔ)法很強(qiáng)大, 很多SQL可以做的,它都可以做。n 計(jì)算集合的總記錄數(shù)、分頁(yè)查詢、按條件查詢、in 查詢 、查詢排序、動(dòng)態(tài)查詢等等。n 但不支持JOIN,這樣帶來(lái)的好處是數(shù)據(jù)更易于管理,消除了傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)中影響性n 能和水平擴(kuò)展性的“JOIN”操作5、刪除操作n 刪除數(shù)據(jù)使用db.collname.remvoe()命令n 可以按條件刪除某條或多條數(shù)據(jù)3. Mongodb應(yīng)用3.1. 查詢3.1.1. 條件操作符$gt : $lt : = $lte: = $ne : !

21、=、 $in : in $nin: not in $all: all $not: 反匹配(1.3.3及以上版本)3.1.2. 查詢舉例查詢 name = bruce 的數(shù)據(jù) db.users.find( name : bruce ); 查詢 name bruce and age = 18 的數(shù)據(jù) 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

22、($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); 限制返回記錄數(shù)量limit() 返回5條記錄 db.users.find().limit(5); 返回3條記錄并打印信息 db.users.find().limit(3).forEach(function(user)

23、 print(my age is + user.age); 結(jié)果 my age is 18 my age is 19 my age is 20 限制返回記錄的開(kāi)始點(diǎn)skip() 從第3條記錄開(kāi)始,返回5條記錄(limit 3, 5) db.users.find().skip(3).limit(5); 查詢記錄條數(shù)count() db.users.find().count(); db.users.find(age:18).count(); 以下返回的不是5,而是user表中所有的記錄數(shù)量 db.users.find().skip(10).limit(5).count(); 如果要返回限制之后的記

24、錄數(shù)量,要使用count(true)或者count(非0) db.users.find().skip(10).limit(5).count(true); 分組group() 假設(shè)test表只有以下一條數(shù)據(jù) domain: , invoked_at: d:2009-11-03, t:17:14:05 , response_time: 0.05 , http_action: GET /display/DOCS/Aggregation 使用group統(tǒng)計(jì)test表11月份的數(shù)據(jù)count:count(*)、total_time:sum(response_time)、a

25、vg_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_ac

26、tion : 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可以像操作普通文件一樣對(duì)GridFS文件進(jìn)行操作,包括read(),write(),tell(),seek()等。3.3

27、. 數(shù)據(jù)復(fù)制、自動(dòng)分片MongoDB提供了兩種復(fù)制數(shù)據(jù)的方式master-slave和master-master ;在實(shí)際應(yīng)用中可以實(shí)現(xiàn)數(shù)據(jù)的讀寫分離,通過(guò)任意數(shù)量的從服務(wù)器來(lái)進(jìn)行讀操作,這有利于提高讀的可擴(kuò)展性。n master-slave配置很簡(jiǎn)單,只需在主服務(wù)器啟動(dòng)時(shí)上加-master 選項(xiàng),在從服務(wù)啟動(dòng)時(shí)上加-slave和-source選項(xiàng)即可,這樣在主數(shù)據(jù)庫(kù)更新數(shù)據(jù)的同時(shí),會(huì)自動(dòng)的把數(shù)據(jù)復(fù)制到從數(shù)據(jù)庫(kù)中。master-master復(fù)制與master-slave的區(qū)別是即可讀又可寫。n 目前MongoDB不支持完全的mastermaster復(fù)制,通常情況下不推薦使用master-mas

28、ter模式。n 配置master-master只需運(yùn)行mongod時(shí)同時(shí)加上-master選項(xiàng)和-slave選項(xiàng)。n MongoDB提供了replica pairs模式啟動(dòng)數(shù)據(jù)庫(kù),以這種方式啟動(dòng)后,數(shù)據(jù)庫(kù)會(huì)自動(dòng)協(xié)商誰(shuí)是master誰(shuí)是slave。一旦一個(gè)數(shù)據(jù)庫(kù)服務(wù)器斷電,另一個(gè)會(huì)自動(dòng)接管,并從那一刻起起為master。萬(wàn)一另一個(gè)將來(lái)也出錯(cuò)了,那么master狀態(tài)將會(huì)轉(zhuǎn)回給第一個(gè)服務(wù)器。n 以這種方式啟動(dòng),使用mongod的命令如下:mongod -pairwith -arbiter 自動(dòng)分片n MongoDB包括一個(gè)自動(dòng)分片的的模塊“mongos”,從而可以構(gòu)建一個(gè)大的水平可擴(kuò)展的數(shù)據(jù)庫(kù)集群,

29、可以動(dòng)態(tài)地添加服務(wù)器,自動(dòng)建立一個(gè)水平擴(kuò)展的數(shù)據(jù)庫(kù)集群系統(tǒng),將數(shù)據(jù)庫(kù)分表存儲(chǔ)在sharding的各個(gè)節(jié)點(diǎn)上 ,如下是一個(gè)數(shù)據(jù)庫(kù)集群的示意圖:sharding的配置n 如果要配置sharding,先要允許一個(gè)數(shù)據(jù)庫(kù)sharding,然后要指定數(shù)據(jù)庫(kù)里集合的分片方式,這些都有相應(yīng)的命令可以完成。3.4. Java程序簡(jiǎn)要用法3.4.1. 建立連接要建立MongoDB的連接,你只要指定要連接到的數(shù)據(jù)庫(kù)就可以。這個(gè)數(shù)據(jù)庫(kù)不一定存在,如果不存在,MongoDB會(huì)先為你建立這個(gè)庫(kù)。同時(shí),在連接時(shí)你也可以具體指定要連接到的網(wǎng)絡(luò)地址和端口。下面的是連接本機(jī)數(shù)據(jù)庫(kù)的一些例子:import com.mongodb

30、.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. 安全驗(yàn)證(非必選)MongoDB服務(wù)可以在安全模式

31、運(yùn)行,此時(shí)任何客戶端要連接數(shù)據(jù)庫(kù)時(shí)需使用用戶名和密碼。在JAVA中可使用如下方法連接:boolean auth = db.authenticate(userName, password);如果用戶名密碼驗(yàn)證通過(guò),返回值為true,否則為false3.4.3. 獲取集合列表每個(gè)數(shù)據(jù)庫(kù)都存在零個(gè)或多個(gè)集合,需要時(shí)你可以獲得他們的列表:Set colls = db.getCollectionNames();for(String s : colls)System.out.println(s);3.4.4. 獲得一個(gè)集合要獲得某個(gè)特定集合,你可以指定集合的名字,并使用getCollection()方法:

32、DBCollection coll = db.getCollection(testCollection);當(dāng)你獲取了這個(gè)集合對(duì)象,你就可以對(duì)數(shù)據(jù)進(jìn)行增刪查改之類的操作。3.4.5. 插入文檔當(dāng)你獲得了一個(gè)集合對(duì)象,你就可以把文檔插入到這個(gè)對(duì)象中。例如,存在一個(gè)JSON式的小文檔:name : MongoDB,type : database,count : 1,info : x : 203,y : 102 請(qǐng)注意,這個(gè)文檔包含一個(gè)內(nèi)部文檔。我們可以使用BasicDBObject類來(lái)創(chuàng)建這個(gè)文檔,并且使用insert()方法方便地將它插入到集合中。BasicDBObject doc = new B

33、asicDBObject();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()查找集合中第一個(gè)文檔要查找我們上一步插入的那個(gè)文檔,可以簡(jiǎn)單地使用findOne()操作來(lái)獲取集合中第一個(gè)文檔。這個(gè)方法返回一個(gè)單一文檔(這是相對(duì)于使用DBCursor的find(

34、)操作的返回),這對(duì)于只有一個(gè)文檔或我們剛插入第一個(gè)文檔時(shí)很有用,因?yàn)榇藭r(shí)并不需要使用光標(biāo)。DBObject myDoc = coll.findOne();System.out.println(myDoc);返回類似:_id : ac907a1f5b9d5e4a233ed300 ,name : MongoDB ,type : 1 ,info : x : 203 ,y : 102 ,_ns : testCollection注意_id和_ns元素是由MongoDB自動(dòng)加入你的文檔。記住:MongoDB內(nèi)部存儲(chǔ)使用的元素名是以“_”做為開(kāi)始。3.4.7. 加入多種文檔為了做更多有趣的查詢?cè)囼?yàn),讓我們

35、向集合中加入多種文檔類型,象:i : value可以通過(guò)循環(huán)來(lái)實(shí)現(xiàn)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();當(dāng)然,我們也可以做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. 創(chuàng)

溫馨提示

  • 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)論