MongoDB入門(mén)講解_第1頁(yè)
MongoDB入門(mén)講解_第2頁(yè)
MongoDB入門(mén)講解_第3頁(yè)
MongoDB入門(mén)講解_第4頁(yè)
MongoDB入門(mén)講解_第5頁(yè)
已閱讀5頁(yè),還剩50頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、nosqlnosql數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)_MongoDB_MongoDB2015-10-02CONTENTS目錄1 12 23 34 4MongoDBMongoDB簡(jiǎn)介簡(jiǎn)介MongoDBMongoDB下載安裝下載安裝MongoDBMongoDB應(yīng)用應(yīng)用GridFSGridFS存取數(shù)據(jù)機(jī)制存取數(shù)據(jù)機(jī)制6 67 78 89 9服務(wù)器管理服務(wù)器管理MongoDBMongoDB總結(jié)總結(jié)MongoDBMongoDB與與mysqlmysql對(duì)比對(duì)比復(fù)制與分片復(fù)制與分片5 5初步了解初步了解MongoDBMongoDB,認(rèn)識(shí)什么是,認(rèn)識(shí)什么是mongoDBmongoDB,為什么要用為什么要用MongoDBMongo

2、DB,MongoDBMongoDB特性特性第第 一一 節(jié)節(jié)返回返回MongoDBMongoDB簡(jiǎn)介簡(jiǎn)介什么是MongoDB?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ù)的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類(lèi)似json的bson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類(lèi)型。Mongo最大的特點(diǎn)是他支持的查詢(xún)語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類(lèi)似于面向?qū)ο蟮牟樵?xún)語(yǔ)言,幾乎可以實(shí)現(xiàn)類(lèi)似關(guān)系數(shù)據(jù)庫(kù)單表查詢(xún)的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。MongoDB的特點(diǎn)?高性能、易部署、易使用,存儲(chǔ)數(shù)據(jù)非常方便MongoDBMongoDB簡(jiǎn)介簡(jiǎn)介MongoDB主要功能

3、特性?面向集合存儲(chǔ),易存儲(chǔ)對(duì)象類(lèi)型的數(shù)據(jù)。 模式自由。 支持動(dòng)態(tài)查詢(xún)。 支持完全索引,包含內(nèi)部對(duì)象。 支持查詢(xún)。 支持復(fù)制和故障恢復(fù)。 使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ),大型對(duì)象(如視頻等)。 自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展性 支持RUBY,PYTHON,JAVA,C+,PHP等多種語(yǔ)言。 文件存儲(chǔ)格式為BSON(一種JSON的擴(kuò)展) 可通過(guò)網(wǎng)絡(luò)訪問(wèn)MongoDBMongoDB簡(jiǎn)介簡(jiǎn)介使用原理所謂“面向集合”(Collenction-Oriented),意思是數(shù)據(jù)被分組存儲(chǔ)在數(shù)據(jù)集中,被稱(chēng)為一個(gè)集合(Collenction)。每個(gè)集合在數(shù)據(jù)庫(kù)中都有一個(gè)唯一的標(biāo)識(shí)名,并且可以包含無(wú)限數(shù)目的文檔。集

4、合的概念類(lèi)似關(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è)文檔,為字符串類(lèi)型,而值則可以是各種復(fù)雜的文件類(lèi)型。我們稱(chēng)這種存儲(chǔ)形式為BSON(Binary JSON)。MongoDBMongoDB簡(jiǎn)介簡(jiǎn)介為什么要用MongoDB?MongoDB的設(shè)計(jì)是要結(jié)合鍵值存儲(chǔ)和關(guān)系型數(shù)據(jù)庫(kù)的最好特性。鍵值存儲(chǔ),因?yàn)榉浅:?jiǎn)單,

5、所以速度極快而且相對(duì)容易伸縮。關(guān)系型數(shù)據(jù)庫(kù)較難伸縮,至少很難水平伸縮,但擁有富數(shù)據(jù)模型和強(qiáng)大的查詢(xún)語(yǔ)言。如果MongoDB能介于兩者之間,就能成為一款易伸縮、能存儲(chǔ)豐富數(shù)據(jù)結(jié)構(gòu)、提供復(fù)雜查詢(xún)機(jī)制的數(shù)據(jù)庫(kù)。在使用場(chǎng)景方面,MongoDB非常適合用做以下應(yīng)用程序的主要數(shù)據(jù)存儲(chǔ):Web應(yīng)用程序、分析與記錄應(yīng)用程序,以及任何要求有中等級(jí)別緩存的應(yīng)用程序。此外,由于它能方便地存儲(chǔ)無(wú)Schema數(shù)據(jù),MongoDB還很適合保存事先無(wú)法知曉其數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)。了解如何獲得了解如何獲得MongoDBMongoDB軟件,包括如何軟件,包括如何為自己的環(huán)境選擇正確的版本,如何在為自己的環(huán)境選擇正確的版本,如何在Wi

6、ndowsWindows和和linuxlinux中安裝和檢測(cè)運(yùn)行。中安裝和檢測(cè)運(yùn)行。第第 二二 節(jié)節(jié)返回返回MongoDBMongoDB下載安裝下載安裝選擇正確版本?MongoDB所使用的版本管理相當(dāng)簡(jiǎn)單:偶數(shù)號(hào)為穩(wěn)定版,奇數(shù)號(hào)為開(kāi)發(fā)版。注意:32 位產(chǎn)品與 64 位產(chǎn)品之間的區(qū)別。32 位和 64 位版本的數(shù)據(jù)庫(kù)目前有著相同的功能,唯一的區(qū)別是:32 位版本將每個(gè)服務(wù)器的數(shù)據(jù)集總大小限制在 2GB左右;64 位版本沒(méi)有任何限制,所以在生產(chǎn)環(huán)境中應(yīng)該優(yōu)先使用 64 位版本。另外,不同的版本之間也有可能發(fā)生變化下載MongoDB?下載地址:/downl

7、oads安裝MongoDB?在Linux中安裝MongoDB,有兩種方式:一、通過(guò)倉(cāng)庫(kù)安裝 MongoDB;二、手動(dòng)安裝MongoDB在Windows中安裝MongoDB,只需要根據(jù)自己的需要下載安裝包、解壓后運(yùn)行即可。MongoDBMongoDB下載安裝下載安裝安裝解壓安裝包后在mongodb 下建立Data文件夾 mongodbdata ,然后分別建立db,log兩個(gè)文件夾,至此mongodb下有以下文件夾 mongodbbin mongodbdatadb mongodbdatalog 在 l o g 文 件 夾 下 創(chuàng) 建 一 個(gè) 日 志 文 件 M o n g o D B . l o

8、g ,mongodbdatalogMongoDB.logMongoDBMongoDB下載安裝下載安裝啟動(dòng)MongoDB?命令行方式啟動(dòng):只需按照啟動(dòng)命令來(lái)執(zhí)行就行了。配置文件方式啟動(dòng):MongoDB也支持同mysql一樣的讀取啟動(dòng)配置文件的方式來(lái)啟動(dòng)數(shù)據(jù)庫(kù)Daemon方式啟動(dòng):啟動(dòng)MongoDB進(jìn)程的session窗口不小心關(guān)閉時(shí),MongoDB進(jìn)程也將隨之停止,MongoDB提供了一種后臺(tái)Daemon方式啟動(dòng)的選擇,只需加上一個(gè)”-fork”參數(shù)即可停止MongoDB?Control-C:通過(guò)Control-C的方式去停止MongoDB實(shí)例shutdownServer()指令:通過(guò)在admi

9、n庫(kù)中發(fā)送db.shutdownServer()指令去停止MongoDB實(shí)例Unix系統(tǒng)指令:在找到實(shí)例的進(jìn)程后,可能通過(guò)發(fā)送kill -2 PID或kill -15 PID來(lái)停止進(jìn)程 MongoDBMongoDB下載安裝下載安裝命令啟動(dòng)命令啟動(dòng)進(jìn)入到bin目錄下,輸入命令 ./mongod -dbpath=/usr/local/soft/mongodb/data -logpath=/usr/local/soft/mongodb/logs/MongoDB.log -logappend -auth -port=27017 -fork配置文件啟動(dòng)配置文件啟動(dòng)在mongodb下創(chuàng)建mongo.con

10、fig文件,編輯mongo.config,輸入 dbpath=D:mongodbdatadb logpath=D:mongodblogmongo.log 進(jìn)入bin目錄下,輸入mongod -config /mongodb/mongo.config MongoDBMongoDB下載安裝下載安裝停止服務(wù)停止服務(wù)最穩(wěn)妥的方式,處理完當(dāng)前所有操作并將緩存的數(shù)據(jù)保存到磁盤(pán)上才停止 user admin db.shutdownServer(); 當(dāng)然我們也可以直接關(guān)閉進(jìn)程,但這種方式會(huì)導(dǎo)致緩存中的數(shù)據(jù)未急時(shí)刷新保存到磁盤(pán)上而丟失參數(shù)解釋參數(shù)解釋: : -dbpath 數(shù)據(jù)庫(kù)路徑(數(shù)據(jù)文件) -logpa

11、th 日志文件路徑 -master 指定為主機(jī)器 -slave 指定為從機(jī)器 -source 指定主機(jī)器的IP地址 -logappend 日志文件末尾添加MongoDBMongoDB下載安裝下載安裝 -pologSize 指定日志文件大小不超過(guò)64M.因?yàn)閞esync是非常操作量大且耗時(shí),最好通過(guò)設(shè)置一個(gè)足夠大的oplogSize來(lái)避免resync(默認(rèn)的 oplog大小是空閑磁盤(pán)大小的5%)。 -port 啟用端口號(hào) -fork 在后臺(tái)運(yùn)行 -only 指定只復(fù)制哪一個(gè)數(shù)據(jù)庫(kù) -slavedelay 指從復(fù)制檢測(cè)的時(shí)間間隔 -auth 是否需要驗(yàn)證權(quán)限登錄(用戶(hù)名和密碼)本節(jié)主要了解怎么運(yùn)用

12、本節(jié)主要了解怎么運(yùn)用MongoDBMongoDB,包括,包括其添加,修改,刪除,查詢(xún),索引,聚其添加,修改,刪除,查詢(xún),索引,聚合。本節(jié)將會(huì)是重點(diǎn)。合。本節(jié)將會(huì)是重點(diǎn)。第第 三三 節(jié)節(jié)返回返回MongoDBMongoDB應(yīng)用應(yīng)用名稱(chēng)名稱(chēng)說(shuō)明說(shuō)明db.collection.insert()在集合中創(chuàng)建一個(gè)新文檔。db.collection.save()提供insert()和update ()插入新文件的包裝。db.collection.update()修改集合中的文檔。db.collection.find()集合上執(zhí)行查詢(xún),并返回一個(gè)游標(biāo)對(duì)象。db.collection.findOne()執(zhí)行查

13、詢(xún),并返回一個(gè)單獨(dú)的文檔。db.collection.remove()從集合中刪除的文件。db.collection.count()換行計(jì)數(shù)集合或匹配查詢(xún)中返回的文檔數(shù)的計(jì)數(shù)。db.collection.distinct()返回一個(gè)數(shù)組沒(méi)有指定的字段不重復(fù)值的文件。MongoDBMongoDB應(yīng)用應(yīng)用添加?添加有兩種方式insert()與save() MongoDB是面向文檔存儲(chǔ)的數(shù)據(jù)庫(kù),文檔結(jié)構(gòu)形式叫BSON(類(lèi)似JSON) db.c1.insert(name:user1); db.c1.save(_id:1, name:user1); 他們兩者之間的區(qū)別是: 1、使用save函數(shù)里,如果原

14、來(lái)的對(duì)象不存在,那他們都插入數(shù)據(jù),如果已經(jīng)存在,save會(huì)調(diào)用update更新里面的記錄,而insert則會(huì)忽略操作 2、insert可以一次性插入一個(gè)列表,而不用遍歷,效率高, save則需要遍歷列表,一個(gè)個(gè)插入。具體的看一下函數(shù)的源碼。MongoDBMongoDB應(yīng)用應(yīng)用數(shù)組操作?$push向文檔數(shù)組中添加元素,如果沒(méi)有該數(shù)組,則自動(dòng)添加數(shù)組。db.foo.update(,$push:users:1)向users數(shù)組末尾添加一個(gè)1元素db.foo.update(,$push:users:“$each”:1,2)向users數(shù)組末尾添加多個(gè)元素,要$each 配合使用$addToSet 可以

15、避免插入重復(fù)元素,配合$each使用,可以添加多個(gè)不同的值,數(shù)組修改器慢,因?yàn)槲臋n大小可能會(huì)變$pop從頭部或尾部刪除元素$pull刪除滿足條件的元素,不止刪除一個(gè)默認(rèn)情況下,更新只能對(duì)符合匹配條件的第一個(gè)文檔執(zhí)行操作,要是多個(gè)文檔符合條件,只有第一個(gè)文檔會(huì)被更新,其他文檔不會(huì)發(fā)生變化,要更新所有匹配的文檔,可以將update的第四個(gè)參數(shù)設(shè)置為truedb.foo.update(,$set:name:tes,false,true)在MongoDB找下級(jí)是按點(diǎn)的方式:比如user下有叫l(wèi)ogs數(shù)組,就user.logsMongoDBMongoDB應(yīng)用應(yīng)用修改?db.collection.upda

16、te( , , , ) 修改現(xiàn)有存在的文檔或集合時(shí)使用。默認(rèn)的update()方法值更新單個(gè)文檔。但是如果multi參數(shù)設(shè)置為true,則更新操作可以更新全部符合條件的文檔。 Query 類(lèi)型:文檔;用于更新選擇過(guò)濾。 Update 類(lèi)型:文檔;需要更新的文檔的內(nèi)容。 Upsert 類(lèi)型:文檔或boolean;設(shè)置為true時(shí),當(dāng)查詢(xún)沒(méi)有匹配到文檔時(shí)進(jìn)行新建。默認(rèn)值為false Multi: - 類(lèi)型:文檔或boolean;設(shè)置為true時(shí),則更新滿足查詢(xún)條件的所有文檔(多個(gè))。設(shè)置為false時(shí)只更新單個(gè)文檔。默認(rèn)為false。 MongoDBMongoDB應(yīng)用應(yīng)用名字名字說(shuō)明說(shuō)明$inc用

17、來(lái)增加已有鍵的值,或者在鍵不存在時(shí)創(chuàng)建一個(gè)鍵。是專(zhuān)門(mén)來(lái)增加(和減少)數(shù)字的。只能用于整數(shù)、長(zhǎng)整數(shù)或雙精度浮點(diǎn)數(shù)。$rename重命名字段。新的字段名稱(chēng)不能和文檔中現(xiàn)有的字段名相同。$setOnInsert執(zhí)行insert操作時(shí),操作給相應(yīng)的字段賦值。$set用來(lái)指定一個(gè)鍵的值。如果這個(gè)鍵不存在,則創(chuàng)建它。$unset從文檔中移除指定的鍵。MongoDBMongoDB應(yīng)用應(yīng)用刪除?db.collection.remove(query, justOne)Query 類(lèi)型:文檔;用于刪除選擇過(guò)濾。JustOne 類(lèi)型:boolean;當(dāng)設(shè)置為true時(shí)只刪除一個(gè)文檔。db.collection.re

18、move();刪除collection中的所有數(shù)據(jù),一旦刪除不可恢復(fù)。但是不會(huì)刪除collection;db.collection.drop();直接刪除collection;去重?Distinct()db.collection.distinct(field, query)Field 類(lèi)型:字符串;返回非重復(fù)的字段。Query 類(lèi)型:文檔;查詢(xún)條件。db.user.distinct(_id, age: 1) MongoDBMongoDB應(yīng)用應(yīng)用查詢(xún)?db.collection.find(, )find()返回的是一個(gè)文檔集合;db.collection.findOne(, )findOne()

19、返回的是一個(gè)文檔前一個(gè)是查詢(xún)條件,后一個(gè)參數(shù)是顯示的數(shù)據(jù) 查詢(xún)操作符(Query Operators)可以讓我們寫(xiě)出復(fù)雜查詢(xún)條件,讓我們使用的過(guò)程更加靈活。比較查詢(xún)操作符$all 語(yǔ)法: field: $all: , . field:文檔中鍵的名稱(chēng)(不使用雙引號(hào))。 $gt 語(yǔ)法:field: $gt: value 匹配鍵值大于指定值的所有文檔。MongoDBMongoDB應(yīng)用應(yīng)用$gte 語(yǔ)法:field: $gte: value 匹配鍵值不小于指定值的所有文檔。$lt 語(yǔ)法:field: $lt: value 匹配鍵值小于指定值的所有文檔。$lte 語(yǔ)法:field: $lte: valu

20、e 匹配鍵值不大于指定值的所有文檔。$in 語(yǔ)法: field: $in: , , . 匹配鍵值等于指定數(shù)組中任意值的文檔。類(lèi)似sql中in.$nin 語(yǔ)法: field: $nin: , . 匹配鍵不存在或者鍵值不等于指定數(shù)組的任意值的文檔。$ne 語(yǔ)法: field: $ne: value 匹配鍵值不等于指定值的文檔。邏輯查詢(xún)操作符邏輯查詢(xún)操作符$and 語(yǔ)法: $and: , , . , and指定一個(gè)至少包含兩個(gè)表達(dá)式的數(shù)組,選擇出滿足該數(shù)組中所有表達(dá)式的文檔。and操作符使用短路操作,若第一個(gè)表達(dá)式的值為“false”,余下的表達(dá)式將不會(huì)執(zhí)行。$nor語(yǔ)法: $nor: , , .

21、$nor執(zhí)行邏輯NOR運(yùn)算,指定一個(gè)至少包含兩個(gè)表達(dá)式的數(shù)組,選擇出都不滿足該數(shù)組中所有表達(dá)式的文檔。$not語(yǔ)法: field: $not: $not執(zhí)行邏輯NOT運(yùn)算,選擇出不能匹配表達(dá)式的文檔 ,包括沒(méi)有指定鍵的文檔。$not操作符不能獨(dú)立使用,必須跟其他操作一起使用(除$regex)。MongoDBMongoDB應(yīng)用應(yīng)用$or語(yǔ)法: $or: , , . , $or執(zhí)行邏輯OR運(yùn)算,指定一個(gè)至少包含兩個(gè)表達(dá)式的數(shù)組,選擇出至少滿足數(shù)組中一條表達(dá)式的文檔。元素查詢(xún)操作符元素查詢(xún)操作符 $exists語(yǔ)法: field: $exists: 如果$exists的值為true,選擇存在該字段的

22、文檔;若值為false則選擇不包含該字段的文檔。如果該字段的值為null,$exists的值為true會(huì)返回該條文檔,false則不返回。$mod 語(yǔ)法: field: $mod: divisor, remainder 匹配字段值對(duì)(divisor)取模,值等于(remainder)的文檔。$type語(yǔ)法: field: $type: 選擇字段值為指定的BSON數(shù)據(jù)類(lèi)型的文檔.使用下面類(lèi)型對(duì)應(yīng)的編號(hào):MongoDBMongoDB應(yīng)用應(yīng)用 類(lèi)型類(lèi)型名稱(chēng)名稱(chēng)編號(hào)編號(hào)類(lèi)型類(lèi)型名稱(chēng)名稱(chēng)編號(hào)編號(hào)Double 雙精度1String 字符串2Object 對(duì)象3Array 數(shù)組4Binary data二進(jìn)制

23、對(duì)象 5Object id 對(duì)象id7Boolean布爾值 8Date 日期9Null 未定義10R e g u l a r Expression 正則表達(dá)式11JavaScript JavaScript代碼13Symbol 符號(hào)14JavaScript JavaScript代碼(帶范圍)1532-bit integer 32 位整數(shù)16Timestamp 時(shí)間戳1764-bit integer 64 位整數(shù)18Min key 最小鍵255Max key 最大鍵127MongoDBMongoDB應(yīng)用應(yīng)用如果文檔的鍵值是一個(gè)數(shù)組。那么$type將對(duì)數(shù)組里面的元素進(jìn)行類(lèi)型匹配而不是鍵值數(shù)組本身。J

24、avaScript查詢(xún)操作符 $regex regex操作符查詢(xún)中可以對(duì)字符串的執(zhí)行正則匹配。MongoDB使用Perl兼容的正則表達(dá)式(PCRE)庫(kù)來(lái)匹配正則表達(dá)式.可以使用正則表達(dá)式對(duì)象或者regex操作符.db.inventory.find( name: /.4/i );db.inventory.find( name: $regex: .4, $options: i );http:/ 提供四個(gè)選項(xiàng)標(biāo)志)i 如果設(shè)置了這個(gè)修飾符,模式中的字母會(huì)進(jìn)行大小寫(xiě)不敏感匹配。m 默認(rèn)情況下,PCRE 認(rèn)為目標(biāo)字符串是由單行字符組成的(然而實(shí)際上它可能會(huì)包含多行).如果目標(biāo)字符串 中沒(méi)有 n字符,或者

25、模式中沒(méi)有出現(xiàn)“行首”/“行末”字符,設(shè)置這個(gè)修飾符不產(chǎn)生任何影響。s 如果設(shè)置了這個(gè)修飾符,模式中的點(diǎn)號(hào)元字符匹配所有字符,包含換行符。如果沒(méi)有這個(gè)修飾符,點(diǎn)號(hào)不匹配換行符。x 如果設(shè)置了這個(gè)修飾符,模式中的沒(méi)有經(jīng)過(guò)轉(zhuǎn)義的或不在字符類(lèi)中的空白數(shù)據(jù)字符總會(huì)被忽略,并且位于一個(gè)未轉(zhuǎn)義的字符類(lèi)外部的#字符和下一個(gè)換行符之間的字符也被忽略。 這個(gè)修飾符使被編譯模式中可以包含注釋。 注意:這僅用于數(shù)據(jù)字符。 空白字符 還是不能在模式的特殊字符序列中出現(xiàn),比如序列 。注:JavaScript只提供了i和m選項(xiàng),x和s選項(xiàng)必須使用$regex操作符。$where $where操作符功能強(qiáng)大而且靈活,他可以

26、使用任意的JavaScript作為查詢(xún)的一部分,包含JavaScript表達(dá)式的字符串或者JavaScript函數(shù)。最典型的應(yīng)用就是比較文檔中的兩個(gè)鍵的值是否相等.MongoDBMongoDB應(yīng)用應(yīng)用索引?在MongoDB上,索引能提高讀操作和查詢(xún)性能,沒(méi)有索引,mongoDB必須掃描集合中的每一個(gè)文檔,然后選擇與查詢(xún)條件匹配的文檔。索引的管理創(chuàng)建索引命令 db.foo.ensureIndex(“x”:1, “y”:-1)使用ensureIndex來(lái)創(chuàng)建索引,1為升序,-1為倒序 db.test.ensureIndex(“x”:1, “unique”:true)上面這條語(yǔ)句是創(chuàng)建唯一索引,創(chuàng)建

27、唯一索引前可能會(huì)有重復(fù)數(shù)據(jù),我們可以使用”dropDups”來(lái)魯莽的刪除這些重復(fù)數(shù)據(jù),寫(xiě)法如下 db.test.ensureIndex(“x”:1, “unique”:true, “dropDups”:true)MongoDBMongoDB應(yīng)用應(yīng)用我們可以在創(chuàng)建索引時(shí),為索引起個(gè)名字,而不是用系統(tǒng)自動(dòng)生成的名字,寫(xiě)法如下:db.test.ensureIndex(“x”:1, “name”: “myindex”)當(dāng)我們的集合數(shù)據(jù)量很大的時(shí)候,創(chuàng)建索引是一件費(fèi)時(shí)費(fèi)力的事情,我們可以這些寫(xiě)創(chuàng)建索引的語(yǔ)句,是創(chuàng)建索引的過(guò)程在后臺(tái)完成:db.test.ensureIndex(“x”:1, “backgr

28、ound”:true)刪除索引db.test.dropIndex();MongoDBMongoDB應(yīng)用應(yīng)用聚合函數(shù)?count最簡(jiǎn)單的聚合工具就是count了,它返回document的數(shù)量db.foo.count()可以不跟參數(shù)也可以跟查詢(xún)條件distinctdistinct命令返回指定的key的所有不同的值。你必須指定一個(gè)collection和一個(gè)key。db.runCommand(distinct: people,key: age) group $group:_id:$author,count:sum:1sort $sort:count:-1 排序,類(lèi)似于sql中的order by -1是

29、降序排列,1是正序排列l(wèi)limitl分頁(yè)lmatch 用于對(duì)文檔集合進(jìn)行篩選了解什么是了解什么是GridFS,GridFS,為什么要用為什么要用GridFS,GridFS,及其怎么使用及其怎么使用GridFSGridFS存儲(chǔ)文件存儲(chǔ)文件第第 四四 節(jié)節(jié)返回返回GridFSGridFSGridFS 是一種將大型文件存儲(chǔ)在 MongoDB 數(shù)據(jù)庫(kù)中的文件規(guī)范。所有官方支持的驅(qū)動(dòng)均實(shí)現(xiàn)了 GridFS 規(guī)范。為什么要用 GridFS?由于 MongoDB 中 BSON 對(duì)象大小是有限制的,所以 GridFS 規(guī)范提供了一種透明的機(jī)制,可以將一個(gè)大文件分割成為多個(gè)較小的文檔, 這樣的機(jī)制允許我們有效的

30、保存大文件對(duì)象, 特別對(duì)于那些巨大的文件,比如視頻、高清圖片等。如何實(shí)現(xiàn)海量存儲(chǔ)?為實(shí)現(xiàn)這點(diǎn), 該規(guī)范指定了一個(gè)將文件分塊的標(biāo)準(zhǔn)。 每個(gè)文件都將在文件集合對(duì)象中保存一個(gè)元數(shù)據(jù)對(duì)象,一個(gè)或多個(gè) chunk 塊對(duì)象可被組合保存在一個(gè) chunk 塊集合中。大多數(shù)情況下,你無(wú)需了解此規(guī)范中細(xì)節(jié),而可將注意力放在各個(gè)語(yǔ)言版本的驅(qū)動(dòng)中有關(guān) GridFS API 的部分或是如何使用 mongofiles 工具上。 語(yǔ)言支持?GridFS 對(duì) Java, Perl, PHP, Python, Ruby 等程序語(yǔ)言均支持,且提供了良好的 API 接口。GridFSGridFSGridFS 使用兩個(gè)表來(lái)存儲(chǔ)數(shù)據(jù)

31、: files 包含元數(shù)據(jù)對(duì)象 chunks 包含其他一些相關(guān)信息的二進(jìn)制塊為了使多個(gè) GridFS 命名為一個(gè)單一的數(shù)據(jù)庫(kù),文件和塊都有一個(gè)前綴,默認(rèn)情況下,前綴是 fs,所以任何默認(rèn)的 GridFS 存儲(chǔ)將包括命名空間 fs.files 和 fs.chunks。各種第三方語(yǔ)言的驅(qū)動(dòng)有權(quán)限改變這個(gè)前綴,所以你可以嘗試設(shè)置另一個(gè) GridFS 命名空間用于存儲(chǔ)照片,它的具體位置為:photos.files 和 photos.chunks。mongofiles 是從命令行操作 GridFS 的一種工具本節(jié)將會(huì)詳細(xì)介紹本節(jié)將會(huì)詳細(xì)介紹MongoDBMongoDB的復(fù)制和分的復(fù)制和分片,將會(huì)作為重點(diǎn)

32、。片,將會(huì)作為重點(diǎn)。第第 五五 節(jié)節(jié)返回返回復(fù)制與分片復(fù)制與分片復(fù)制:復(fù)制:使用復(fù)制可以將數(shù)據(jù)副本保存到多臺(tái)服務(wù)器上,即使一臺(tái)或者多臺(tái)服務(wù)器出錯(cuò),也可以保證應(yīng)用程序正常運(yùn)行和數(shù)據(jù)的安全。什么是副本集?副本集是一組服務(wù)器,其中一個(gè)位主服務(wù)器,用于處理客戶(hù)端的請(qǐng)求,還有很多備份服務(wù)器,用于保存主服務(wù)器的數(shù)據(jù)副本,如果主服務(wù)器崩潰了,備份服務(wù)器會(huì)自動(dòng)將一個(gè)成員升級(jí)為新的主服務(wù)器。 在mongoDB中創(chuàng)建一個(gè)副本集之后就可以使用復(fù)制功能了。使用復(fù)制功能時(shí),如果有一臺(tái)服務(wù)器宕機(jī)了,仍然可以從副本集的其他服務(wù)器上訪問(wèn)數(shù)據(jù),如果服務(wù)器上的數(shù)據(jù)損壞或者不可訪問(wèn),可以從副本集的某個(gè)成員中創(chuàng)建一份新的數(shù)據(jù)副本創(chuàng)建

33、副本集創(chuàng)建副本集創(chuàng)建副本命令 replicaSet=new ReplSetTest(nodes:3) replicaSet.startSet();/啟動(dòng)3個(gè)mongod進(jìn)程 replicaSet.initiate();/配置復(fù)制功能 復(fù)制與分片復(fù)制與分片在主節(jié)點(diǎn)上執(zhí)行:isMaster()可以查看副本集的狀態(tài)。i s M a s t e r 其 中 有 一 個(gè) 很 重 要 的 字 段 指 明 了 這 是 一 個(gè) 主 節(jié) 點(diǎn)(isMaster:true),副本集還有一個(gè)hosts列表備份節(jié)點(diǎn)數(shù)據(jù)可能落后與主節(jié)點(diǎn),可能沒(méi)有最新寫(xiě)入的數(shù)據(jù),所以默認(rèn)是拒絕訪問(wèn)的。以防止應(yīng)用程序意外拿到過(guò)期的數(shù)據(jù)。如果

34、在備份節(jié)點(diǎn)上做查詢(xún),可能得到一個(gè)錯(cuò)誤提示,說(shuō)當(dāng)前節(jié)點(diǎn)不是主節(jié)點(diǎn)。 要想在備份節(jié)點(diǎn)讀取數(shù)據(jù)應(yīng)該輸入命令:setSlaveOk();這樣就可以讀 取數(shù)據(jù)了。不能對(duì)備份節(jié)點(diǎn)執(zhí)行寫(xiě)操作。備份節(jié)點(diǎn)只能通過(guò)復(fù)制功能寫(xiě)入數(shù)據(jù),不接受客戶(hù)端的寫(xiě)入請(qǐng)求??蛻?hù)端在單臺(tái)服務(wù)器上可以執(zhí)行的請(qǐng)求,都可以發(fā)送到主節(jié)點(diǎn)執(zhí)行關(guān)閉副本集命令:replicaSet.stopSet()復(fù)制與分片復(fù)制與分片配置副本集啟動(dòng)mongoDB服務(wù)$mongod -replSet spock -f mongod.conf -fork 只有第一個(gè)副本集成員擁有數(shù)據(jù),其他成員數(shù)據(jù)目錄為空,只要將成員添加到副本集中,會(huì)自動(dòng)克隆第一個(gè)成員的數(shù)據(jù)。剛開(kāi)

35、始啟動(dòng)服務(wù)是他們之間是互不相通的,要想讓成員知道彼此,需要?jiǎng)?chuàng)建一個(gè)配置文件:config=_id:spock, members:_id:0,host:主機(jī)名1,_id:1,host:主機(jī)名2,_id:2,host:主機(jī)名3復(fù)制與分片復(fù)制與分片將config對(duì)象發(fā)送給其中一個(gè)副本集成員連接到一個(gè)有數(shù)據(jù)的服務(wù),然后執(zhí)行命令,初始化副本集rs.initiate(config)然后這個(gè)服務(wù)器就會(huì)解析配置對(duì)象,向其他成員發(fā)送消息,所有成員都配置完成之后,他們會(huì)自動(dòng)選出一個(gè)主節(jié)點(diǎn),就可以正常處理讀寫(xiě)請(qǐng)求了。修改副本集配置rs.add(服務(wù)主機(jī)名:端口號(hào));為副本集添加新成員。rs.remove(服務(wù)主機(jī)名

36、:端口號(hào)) 刪除副本集中的成員除了添加成員外,其他改變副本集配置的行為時(shí)主節(jié)點(diǎn)會(huì)關(guān)閉所有連接,重新配置副本集時(shí),主節(jié)點(diǎn)需要先退化為普通節(jié)點(diǎn),以便接受新的配置。重新配置副本集之后,副本集暫時(shí)沒(méi)有主節(jié)點(diǎn),之后就會(huì)經(jīng)過(guò)選舉產(chǎn)生新的主節(jié)點(diǎn)?;謴?fù)正常rs.config()查看配置修改是否成功。復(fù)制與分片復(fù)制與分片分片:是指將用戶(hù)拆分,將其分散存放在不同機(jī)器上的過(guò)程,用于處理更大的負(fù)載,mongoDB 支持自動(dòng)分片。分片與復(fù)制的區(qū)別:復(fù)制是將數(shù)據(jù)同步的存在不同服務(wù)器上,每個(gè)節(jié)點(diǎn)的數(shù)據(jù)都是相同的,而分片每個(gè)節(jié)點(diǎn)的數(shù)據(jù)是不相同的,拆分?jǐn)?shù)據(jù)。sh.enablesharding();啟動(dòng)分片。sh.shardco

37、llection(colection:分片依據(jù));進(jìn)行分片如果查詢(xún)的時(shí)候不使用片鍵的話,就會(huì)將查詢(xún)發(fā)送的每個(gè)分片;如果集合存在必須為片鍵添加索引,如果不添加索引,進(jìn)行分片的時(shí)候會(huì)報(bào)錯(cuò),如果集合不存在。mongodb會(huì)自動(dòng)在片鍵上創(chuàng)建索引。拆分快:達(dá)到拆分閥值點(diǎn)進(jìn)行拆分。復(fù)制與分片復(fù)制與分片對(duì)集合進(jìn)行拆分時(shí),要選擇一個(gè)或兩個(gè)字段用于拆分?jǐn)?shù)據(jù),這個(gè)鍵就叫片鍵。拆分?jǐn)?shù)據(jù)最常用的分發(fā)方式有三種:升序片鍵。類(lèi)似于date或者是ObjectId隨著時(shí)間穩(wěn)定增長(zhǎng)的字段。隨機(jī)分發(fā)的片鍵??梢允怯脩?hù)名,MD5散列值或是數(shù)據(jù)集中其他一些沒(méi)有規(guī)律的鍵基于位置的片鍵,可以是用戶(hù)的IP,地址,經(jīng)緯度。片鍵策略:散列片鍵

38、流水策略多熱點(diǎn)復(fù)制與分片復(fù)制與分片何時(shí)分片?通常不比太早分片,因?yàn)榉制粌H會(huì)增加部署的操作復(fù)雜度,還要求作出設(shè)計(jì)決策,而該決策以后很難改,另外最好也不要再系統(tǒng)運(yùn)行太久之后再做分片,在一個(gè)過(guò)載的系統(tǒng)上不停機(jī)進(jìn)行分片時(shí)非常困難的。分片用來(lái):增加可用RAM,增加可用磁盤(pán)空間減輕單臺(tái)服務(wù)器的負(fù)載處理單個(gè)mongod無(wú)法承受的吞吐量MongodbMongodb存取數(shù)據(jù)機(jī)制存取數(shù)據(jù)機(jī)制第第 六六 節(jié)節(jié)返回返回MongodbMongodb存取數(shù)據(jù)機(jī)制存取數(shù)據(jù)機(jī)制Collections:在mongodb中叫做集合,是文檔的集合。無(wú)模式,可以存儲(chǔ)各種各樣的文檔。類(lèi)似mysql中的表。Document:這里的us

39、er集合(“表”)有一個(gè)document(document可以理解為mysql中的記錄)。文檔是mongodb保存數(shù)據(jù)的基本單元。數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)為BSON格式,也就是我們開(kāi)始添加的文檔,key value鍵值對(duì)類(lèi)型。GridFS:因?yàn)閎son對(duì)象的大小有限制,不適合存儲(chǔ)大型文件,GridFS文件系統(tǒng)為大型文件提供了存儲(chǔ)的方案,GridFS下的fs保存的是圖片、視屏等大文件。MongodbMongodb存取數(shù)據(jù)機(jī)制存取數(shù)據(jù)機(jī)制寫(xiě)入:了解了數(shù)據(jù)結(jié)構(gòu),就知道了存儲(chǔ)機(jī)制,MongoDB 的默認(rèn)數(shù)據(jù)目錄是/data/db,它負(fù)責(zé)存儲(chǔ)所有的MongoDB 的數(shù)據(jù)文件。在MongoDB內(nèi)部,每個(gè)數(shù)據(jù)庫(kù)都包含

40、一個(gè).ns 文件和一些數(shù)據(jù)文件,而且這些數(shù)據(jù)文件會(huì)隨著數(shù)據(jù)量的增加而變得越來(lái)越多。MongoDB 內(nèi)部有預(yù)分配空間的機(jī)制,每個(gè)預(yù)分配的文件都用0 進(jìn)行填充,由于有了這個(gè)機(jī)制, MongoDB 始終保持額外的空間和空余的數(shù)據(jù)文件,從而有效避免了由于數(shù)據(jù)暴增而帶來(lái)的磁盤(pán)壓力過(guò)大的問(wèn)題。 由于表中數(shù)據(jù)量的增加,數(shù)據(jù)文件每新分配一次,它的大小都會(huì)是上一個(gè)數(shù)據(jù)文件大小的2倍,每個(gè)數(shù)據(jù)文件最大2G。這樣的機(jī)制有利于防止較小的數(shù)據(jù)庫(kù)浪費(fèi)過(guò)多的磁盤(pán)空間,同時(shí)又能保證較大的數(shù)據(jù)庫(kù)有相應(yīng)的預(yù)留空間使用。 數(shù)據(jù)庫(kù)的每張表都對(duì)應(yīng)一個(gè)命名空間,每個(gè)索引也有對(duì)應(yīng)的命名空間。這些命名空間的元數(shù)據(jù)都集中在*.ns 文件中。M

41、ongodbMongodb存取數(shù)據(jù)機(jī)制存取數(shù)據(jù)機(jī)制讀取:Mongodb可以使用內(nèi)存映射文件來(lái)處理對(duì)磁盤(pán)文件中數(shù)據(jù)的讀寫(xiě)請(qǐng)求,mongodb并不對(duì)磁盤(pán)和RAM這兩者進(jìn)行區(qū)別對(duì)待,只是將文件看做一個(gè)巨大的數(shù)組,然后按照字節(jié)為單位訪問(wèn)其中的數(shù)據(jù),剩下的都交由操作系統(tǒng)處理。權(quán)限管理,權(quán)限管理,監(jiān)控監(jiān)控MongoDBMongoDB,備份,備份第第 七七 節(jié)節(jié)返回返回MongoDBMongoDB服務(wù)器管理服務(wù)器管理使用認(rèn)證保護(hù)服務(wù)器?MongoDB支持簡(jiǎn)單的基于角色的認(rèn)證系統(tǒng),通過(guò)該系統(tǒng)可以控制用戶(hù)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)以及他們被授予的訪問(wèn)級(jí)別。啟動(dòng)的時(shí)候指定參數(shù),可以阻止客戶(hù)端的訪問(wèn)和連接。先啟用系統(tǒng)的登錄驗(yàn)證

42、模塊, 只需在啟動(dòng)時(shí)指定 auth 參數(shù)即可MongoDB用戶(hù)角色:Read:允許用戶(hù)讀取指定的數(shù)據(jù)庫(kù)。readWrite:授予用戶(hù)指定數(shù)據(jù)庫(kù)的讀和寫(xiě)權(quán)限。dbAdmin:允許用戶(hù)在指定的數(shù)據(jù)庫(kù)中執(zhí)行管理函數(shù)。userAdmin:允許用戶(hù)向system.users集合中寫(xiě)入,具有該權(quán)限的用戶(hù)可以在該數(shù)據(jù)庫(kù)中創(chuàng)建,刪除和管理用戶(hù)。clusterAdmin:只在admin數(shù)據(jù)庫(kù)可使用,為用戶(hù)賦予所有分片和復(fù)制集相關(guān)函數(shù)的完全管理權(quán)限。MongoDBMongoDB服務(wù)器管理服務(wù)器管理添加刪除用戶(hù)?添加命令:db.addUser(user_reader, user_pwd, true)刪除命令:db.

43、system.users.remove(user:java1);監(jiān)控MongoDB?性能監(jiān)控:mongosniff:此工具可以從底層監(jiān)控到底有哪些命令發(fā)送給了 MongoDB 去執(zhí)行。 Mongostat:工具可以快速的查看某組運(yùn)行中的 MongoDB 實(shí)例的統(tǒng)計(jì)信息。 db.serverStatus:這個(gè)命令是最常用也是最基礎(chǔ)的查看實(shí)例運(yùn)行狀態(tài)的命令之一。db.stats:查看數(shù)據(jù)庫(kù)狀態(tài)信息MongoDB 從一面世就得到眾多開(kāi)源愛(ài)好者和團(tuán)隊(duì)的重視,在常用的監(jiān)控框架如 cacti、Nagios、Zabbix 等基礎(chǔ)上進(jìn)行擴(kuò)展,進(jìn)行 MongoDB 的監(jiān)控都是非常方便的MongoDBMongoDB服務(wù)器管理服務(wù)器管理備份?文件快照方式這是最簡(jiǎn)單的備份方法。但是,需要系統(tǒng)文件支持快照和mongod必須啟用journal?;謴?fù)時(shí),確保沒(méi)有運(yùn)行mongod,執(zhí)行快照恢復(fù)操作命令,然后啟動(dòng)mongod進(jìn)程,mongod將重放journal日志。使用mongodump方式千萬(wàn)不要fsyncLock與mongodump配合使用,如果數(shù)據(jù)庫(kù)被鎖定了,mongodump將永遠(yuǎn)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論