《NOSQL數(shù)據(jù)庫技術(shù)》課件第5章-MongoDB文檔數(shù)據(jù)庫_第1頁
《NOSQL數(shù)據(jù)庫技術(shù)》課件第5章-MongoDB文檔數(shù)據(jù)庫_第2頁
《NOSQL數(shù)據(jù)庫技術(shù)》課件第5章-MongoDB文檔數(shù)據(jù)庫_第3頁
《NOSQL數(shù)據(jù)庫技術(shù)》課件第5章-MongoDB文檔數(shù)據(jù)庫_第4頁
《NOSQL數(shù)據(jù)庫技術(shù)》課件第5章-MongoDB文檔數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

目錄MongoDB基礎(chǔ)1MongoDB文檔操作技術(shù)基礎(chǔ)2MongoDB數(shù)據(jù)庫集群架構(gòu)3MongoDB管理與監(jiān)控4小結(jié)51MongoDB官網(wǎng):/2目錄本章MongoDB數(shù)據(jù)庫技術(shù)學(xué)習(xí)內(nèi)容思維導(dǎo)圖如下MongoDB官網(wǎng):http://www.MongoDB.org/downloadsWin10平臺下載:MongoDB-win32-x86_64-2008plus-ssl-4.0.6-signed.msi安裝默認(rèn)路徑:C:\ProgramFiles\MongoDB\Server\4.05.1.1下載與安裝{"_id"

:ObjectId("590d63bd59e819a6ae569a65"),"address":{"building"

:"203","coord":[

-73.97822040000001,40.6435254],

"street":

"ChurchAvenue","zipcode":"11218"

},"borough":"Brooklyn","cuisine":"IceCream,Gelato,

Yogurt,Ices","grades":

[

{"date":ISODate("2014-02-10T00:00:00Z"),"grade":"A","score":

2},

{"date":ISODate("2013-01-02T00:00:00Z"),"grade":

"A",

"score":13

},{"date":ISODate("2012-01-09T00:00:00Z"),"grade"

:

"A","score"

:AnIntroduction

to

DatabaseSystemMongoDB安裝完畢后,可查看系統(tǒng)的服務(wù)列表將安裝路徑bin目錄添加到系統(tǒng)環(huán)境變量Path后,可在命令行窗口中執(zhí)行以下命令進(jìn)一步驗證是否安裝成功,MongoDB數(shù)據(jù)庫服務(wù)默認(rèn)端口號為27017,將進(jìn)入MongoDBShell環(huán)境>mongo或者>mongo--host:270175.1.1下載與安裝{"_id"

:ObjectId("590d63bd59e819a6ae569a65"),"address":{"building"

:"203","coord":[

-73.97822040000001,40.6435254],

"street":

"ChurchAvenue","zipcode":"11218"

},"borough":"Brooklyn","cuisine":"IceCream,Gelato,

Yogurt,Ices","grades":

[

{"date":ISODate("2014-02-10T00:00:00Z"),"grade":"A","score":

2},

{"date":ISODate("2013-01-02T00:00:00Z"),"grade":

"A",

"score":13

},{"date":ISODate("2012-01-09T00:00:00Z"),"grade"

:

"A","score"

:AnIntroduction

to

DatabaseSystemMongoDBShell:可以運(yùn)行任何JavaScript腳本;在Shell中可以鍵入help以獲取幫助;執(zhí)行exit命令、quit()、Ctrl+C均可退出Shell環(huán)境5.1.1下載與安裝bin目錄下配置文件:mongod.cfg其他配置項:多節(jié)點(diǎn)部署地址、分片、復(fù)制集、安全管理、網(wǎng)絡(luò)接口等5.1.1下載與安裝Bin目錄下可執(zhí)行程序:5.1.1下載與安裝可執(zhí)行文件名稱說明mongod啟動數(shù)據(jù)庫實例進(jìn)程對應(yīng)的可執(zhí)行文件。是整個MongoDB中最核心的內(nèi)容,負(fù)責(zé)數(shù)據(jù)庫的創(chuàng)建、刪除等各項管理工作,運(yùn)行在服務(wù)器端為客戶端提供監(jiān)聽。詳細(xì)參數(shù)說明請查看mongod—helpmongo是一個與mongod進(jìn)程進(jìn)行交互的JavaScriptShell進(jìn)程,它提供了一些交互函數(shù),用于系統(tǒng)管理員對數(shù)據(jù)庫系統(tǒng)進(jìn)行管理mongodump提供了一種從,MongoDB實例上創(chuàng)建BSONdump文件的方法,如mongodump--port27017--dbtest--outd:\bakmongorestore可以將mongodump命令導(dǎo)出的文件數(shù)據(jù)恢復(fù)到數(shù)據(jù)庫中mongoexport可以將MongoDB實例數(shù)據(jù)導(dǎo)出為BSON文件mongoexport--port27017--dbtest--collectionfoo--outd:\bak\foo.jsonmongoimport可以將JSON或CSV文件內(nèi)容導(dǎo)入MongoDB,如mongoimport--port27017--dbtest--collectionfoo--filed:\bak\foo.jsonBin目錄下可執(zhí)行程序:5.1.1下載與安裝可執(zhí)行文件名稱說明mongofiles

提供了操作MongoDB分布式文件存儲系統(tǒng)的命令行接口,如可以將本地文件上傳到數(shù)據(jù)庫中保存mongos

分片機(jī)制中用到的進(jìn)程,所有應(yīng)用程序端的查詢操作都會先由它分析,然后它會將查詢定位到具體的某一個分片上mongostat

展示當(dāng)前正在運(yùn)行的mongod實例狀態(tài)的工具mongotop

用于跟蹤分析MongoDB實例花在讀寫數(shù)據(jù)上的時間,它提供的統(tǒng)計數(shù)據(jù)在每一個collection級別上bsondump

將BSON格式的文件轉(zhuǎn)儲為JSON格式的數(shù)據(jù)AnIntroduction

to

DatabaseSystemMongoDB訪問管理工具:Robo3Thttps://Studio3T收費(fèi)版,可試用30天,支持導(dǎo)入、導(dǎo)出,功能豐富其他:Mongovue、RockMongo5.1.1下載與安裝Robo3T:連接數(shù)據(jù)庫

5.1.1下載與安裝界面示意5.1.1下載與安裝切換樹形、表格、文檔輸出格式命令輸入?yún)^(qū)結(jié)果顯示區(qū)數(shù)據(jù)庫、集合選擇區(qū)5.1.2常用操作符MongoDB提供了豐富的文檔操作運(yùn)算符12序號操作符說明示例1)關(guān)系比較類1$lt,$lte$gt,$gte,$eq,$ne<,<=,>,>=,=,<>db.c.find({“a":{$gt:100}})db.c.find({x:{$ne:3}})2$in屬于db.c.find({j:{$in:[2,4,6]}})3$nin不屬于db.c.find({j:{$nin:[2,4,6]}})2)元素查詢類4$exists可選:true,falsedb.c.find({a:{$exists:true}})5$type按數(shù)據(jù)類型查詢db.c.find({a:{$type:2}})3)模式評估類6$mod取模:a%10==1db.c.find({a:{$mod:[10,1]}})7$regex正則表達(dá)式匹配db.c.find({sku:{$regex:/^ABC/i}})8$where主要彌補(bǔ)其他方式無法滿足的查詢條件,一般效率較低db.myCollection.find({"$where":"this.a>3"})5.1.2常用操作符13序號操作符說明示例3)模式評估類9$text文本搜索,要先建索引db.articles.find({$text:{$search:"coffee"}})4)邏輯運(yùn)算類10$nor$or的反操作,即不匹配(a或b)db.c.find({name:"bob",$nor:[{a:1},{b:2}]})11$orOr子句,語義或db.c.find({name:"bob",$or:[{a:1},{b:2}]})12$and與運(yùn)算db.c.find({name:"bob",$and:[{a:1},{b:2}]})13$not非運(yùn)算db.c.find({name:"bob",$not:[{a:1},{b:2}]})5)數(shù)組查詢類14$size匹配數(shù)組長度db.c.find({a:{$size:1}})5.1.2常用操作符$and示例選擇集合inventory中的滿足條件是price不等于1.99并且price字段存在的文檔db.inventory.find({$and:[{price:{$ne:1.99}},

{price:{$exists:true}}]})隱式AND操作db.inventory.find({price:{$ne:1.99,$exists:true}})AND可使用多個子表達(dá)式定義更加復(fù)雜的判定條件db.inventory.find({$and:[

{$or:[{price:0.99},{price:1.99}]},{$or:[{sale:true},{qty:{$lt:20}}]}]})5.1.2常用操作符15序號操作符說明示例5)數(shù)組查詢類15$all數(shù)組中的元素是否完全匹配db.c.find({a:{$all:[2,3]}})16$elemMatch數(shù)組中的元素級別需要匹配的條件db.c.find({product:{"$elemMatch":{shape:"square",color:"purple"}}})6)位查詢操作類17$bitsAllClear所有位的值為0db.c.find({a:{$bitsAllClear:[1,5]}})18$bitsAllSet所有位的值為1db.c.find({a:{$bitsAllSet:[1,5]}})19$bitsAnyClear部分位的值為0db.c.find({a:{$bitsAnyClear:[1,5]}})20$bitsAnySet部分位的值為1db.c.find({a:{$bitsAnySet:[1,5]}})地理空間類操作符$minDistance、$maxDistance、$box、$center、$geoWithin、$near……重點(diǎn)掌握以下內(nèi)容文檔CRUD操作文檔鏈接查詢文檔聚合與管道操作MongoDB索引機(jī)制目錄MongoDB基礎(chǔ)1MongoDB文檔操作技術(shù)基礎(chǔ)2MongoDB數(shù)據(jù)庫集群架構(gòu)3MongoDB管理與監(jiān)控4小結(jié)516MongoDB官網(wǎng):/5.2.1文檔CRUD操作基于存儲客戶信息的ct集合來進(jìn)一步學(xué)習(xí)文檔的CRUD操作,分別示例如下1. 新增文檔實現(xiàn)新增單個客戶信息批量新增多個客戶信息,注意文檔數(shù)組參數(shù)1718DB操作使用insert插入多個文檔,但必須將多個文檔放在一個[]里,作為數(shù)組參數(shù)傳遞,否則默認(rèn)只插入第一個文檔5.2.1文檔CRUD操作1919DB操作2.文檔查詢find條件第1個花括號參數(shù)限定返回文檔各個字段需滿足的條件,如果為空則返回集合中所有文檔

>db.ct.find({})也可以>db.ct.find()

>db.getCollection('ct').find({})#select*fromct

whereName='Yan'

>db.ct.find({Name:"Yan"})

#select*fromct

whereName=‘Li'andage=26

>db.ct.find({Name:"Li",age:26})

5.2.1文檔CRUD操作2020DB操作2.文檔查詢find第2個花括號參數(shù)設(shè)定返回的字段>db.ct.find({age:21},{'Name':1,'age':1})

{"_id":ObjectId("4c452c343d48c8f284b388e0"),"name":"user1","age":21}1表示顯示,0表示不顯示,一般要求都是1或者0

>db.ct.find({},{'age':0})如果只在結(jié)果中顯示具體的內(nèi)容字段,不包含_id字段,參數(shù)設(shè)置示例如下。>db.ct.find({Name:"user1"},{"_id":0})

>db.ct.find({age:23},{_id:0,'Name':1,'age':1})查詢滿足條件的首個文檔>db.ct.findone()5.2.1文檔CRUD操作2121DB操作2.文檔查詢結(jié)果排序,1表示升序,-1表示降序

#select*fromct

orderbyage

>db.ct.find().sort({age:1})

#select*fromct

orderbysexasce,agedesc

>db.ct.find().sort({gender:1,age:-1})使用limit查詢滿足條件的Topk文檔,也可用skip先忽略Topk個文檔,然后在結(jié)果中顯示限制個數(shù)的文檔列表。如下示例表示跳過前3個文檔,然后顯示后續(xù)的2個文檔。>db.ct.find().limit(2).skip(3)5.2.1文檔CRUD操作22222.文檔查詢IN判斷條件

>db.ct.find({age:{$in:[23,26,32]}})

對應(yīng)的操作符有$nin(notin)。OR運(yùn)算

>db.ct.find({$or:[{age:25},{age:28}]})

#age<=23orage>=33

>db.ct.find({$or:[{age:{$lte:23}},{age:{$gte:33}}]})COUNT計數(shù)查詢

>db.ct.find({age:{$gt:30}}).count()5.2.1文檔CRUD操作2323DB操作3.文檔刪除

Removeremove()用于刪除單個或全部文檔,刪除后的文檔無法恢復(fù)。>id=db.ct.findOne({Name:"ChenGang"})._idObjectId(“4c4508818c4a1e0bf570460f”)

>db.ct.remove(id)

//刪除上面id對應(yīng)的行刪除一個或多個文檔也可以分別通過以下方式實現(xiàn)>db.ct.deleteOne({"age":{$gt:25}})>db.ct.deleteMany({"age":{$gt:25}})刪除所有>db.ct.drop()或者>db.ct.remove({})5.2.1文檔CRUD操作2424DB操作3.文檔刪除

Remove

remove函數(shù)還可以配置第二個布爾類型的參數(shù),如果為true,表示只刪除滿足條件的第一個文檔,默認(rèn)為false。5.2.1文檔CRUD操作2525DB操作4.文檔更新

Update常用語法:db.collection.update(criteria,objNew,upsert,mult)criteria:需要被更新的文檔需滿足的條件表達(dá)式(過濾條件)

objNew:更新表達(dá)式

upsert:可選,布爾值,如目標(biāo)記錄不存在,是否插入新文檔

multi:可選,布爾值,是否更新多個文檔一般用法

#updateuserssetage=100,sex=0wherename='

Wang'

>db.ct.update({Name:"Wang"},{$set:{age:100,sex:0}})#updateuserssetage=age+10>db.ct.update({},{$inc:{age:10}},false,true)#updateuserssetage=age+10,sex=1wherename='

Wang'

>db.ct.update({Name:"Wang"},{$inc:{age:10},$set:{sex:1}})5.2.1文檔CRUD操作4.文檔更新

Update精確匹配更新一個文檔>db.ct.update({"_id":ObjectId("5e72ddea4654e4e59dc4d1a0")},{"Name":"Yan","age":23})更新滿足條件的第一個文檔>db.ct.update({"Name":"Chen"},{$set:{"Name":"ChenGang","age":32}},false,false)或者也可以使用以下updateOne函數(shù)實現(xiàn)。>db.ct.updateOne({"Name":"Chen"},

{$set:{"Name":"ChenGang","age":32},

$currentDate:{lastModified:true}})或者>db.ct.replaceOne({"Name":"Li"},{"Name":"LiLi","age":23})26DB操作5.2.1文檔CRUD操作5.2.2文檔鏈接查詢文檔之間存在關(guān)聯(lián)關(guān)系時,可用$lookup查詢db.orders.insertMany([{"_id":1,"item":"almonds","price":12,"quantity":2},{"_id":2,"item":"pecans","price":20,"quantity":1},{"_id":3}])db.inventory.insertMany([{"_id":1,"sku":"almonds",description:"product1","instock":120},{"_id":2,"sku":"bread",description:"product2","instock":80},{"_id":3,"sku":"cashews",description:"product3","instock":60},{"_id":4,"sku":"pecans",description:"product4","instock":70},{"_id":5,"sku":null,description:"Incomplete"},

{"_id":6}])db.orders.aggregate([{$lookup:{from:"inventory",localField:"item",foreignField:"sku",as:"inventory_docs"}}]){"_id":1,

"item":"almonds","price":12,"quantity":2,"inventory_docs":[{"_id":1,"sku":"almonds","description":"product1","instock":120}

]}{"_id":2,

"item":"pecans","price":20,"quantity":1,"inventory_docs":[{"_id":4,"sku":"pecans","description":"product4","instock":70}

]}{"_id":3,"inventory_docs":[{"_id":5,"sku":null,"description":"Incomplete"},{"_id":6}

]}5.2.2文檔鏈接查詢聚合框架可以用來實現(xiàn)類似于SQL的“GROUPBY”的功能,但它的功能不限于此。聚合框架中支持的基本操作:$match:用于過濾數(shù)據(jù),只輸出符合查詢條件的文檔;$sort:將輸入文檔排序后輸出;$limit:用來限制聚合返回的文檔數(shù);$skip:在聚合過程中跳過指定數(shù)量的文檔,并返回余下的文檔;$group:將集合中的文檔分組,可用于統(tǒng)計結(jié)果;$unwind:將文檔中的某一個數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個值;$project:修改輸入文檔的結(jié)構(gòu)??梢杂脕碇孛?、增加或刪除字段;$geoNear:輸出接近某一地理位置的有序文檔;5.2.3文檔聚合與管道操作MongoDB的聚合操作和SQL的關(guān)系5.2.3文檔聚合與管道操作5.2.3文檔聚合與管道操作MongoDB提供三種方式的聚合運(yùn)算1)單一目的的聚合方法(SinglePurposeAggregationMethods)對于簡單的排序、計數(shù)、查看某個字段都有哪些不同取值等操作,MongoDB提供了專門的實現(xiàn)單一目的聚合操作的函數(shù),如sort()、count()、distinct()等。示例如下。>db.inventory.distinct("item")>db.inventory.find({status:"A"}).count()5.2.3文檔聚合與管道操作MongoDB提供三種方式的聚合運(yùn)算2)聚合管道(AggregationPipeline)

管道是指通過一個處理序列,分階段、分步驟地將一系列文檔處理成所需要的結(jié)果。

類似面向?qū)ο缶幊趟枷胫蟹椒ㄦ湹囊来握{(diào)用過程?!氛Z法形式:db.collection.aggregate([階段1,階段2,…,階段n])》階段中可以通過$+field名稱,引用前一階段字段名稱完成相應(yīng)操作5.2.3文檔聚合與管道操作聚合管道示例MongoDB的聚合操作作用?5.2.3文檔聚合與管道操作MongoDB的聚合操作:數(shù)組$unwind作用?5.2.3文檔聚合與管道操作5.2.3文檔聚合與管道操作MongoDB提供三種方式的聚合運(yùn)算3)MR函數(shù)(theMap-ReduceFunction)數(shù)據(jù)庫中通過給集合創(chuàng)建索引能夠大大提高文檔數(shù)據(jù)查詢的性能和效率;可用explain()方法了解find查詢操作都利用了哪些索引可用hint()方法進(jìn)行使用哪些索引。MongoDB會為每個集合的_id字段默認(rèn)創(chuàng)建索引;各個數(shù)據(jù)庫創(chuàng)建的索引存儲在系統(tǒng)自動創(chuàng)建的system.indexes集合中;MongoDB支持全文索引、地理位置索引,支持文本類、地理空間數(shù)據(jù)的高性能訪問;重點(diǎn)掌握三類索引操作:創(chuàng)建、查詢、刪除5.2.4MongoDB索引機(jī)制一般索引操作1)創(chuàng)建索引createIndex()方法的基本語法格式如下:>db.collection.createIndex(keys,options)注:keys值為要創(chuàng)建的索引字段,1為指定按升序創(chuàng)建索引,-1為按降序創(chuàng)建索引。參數(shù)options可以設(shè)置是否后臺創(chuàng)建(background參數(shù)為true)、是否創(chuàng)建唯一索引、是否創(chuàng)建稀疏索引、指定索引名稱等。示例:>db.ct.createIndex({"Name":1})>db.ct.createIndex({"Name":1,"gender":-1})>db.ct.createIndex({"gender":1},{background:true})5.2.4MongoDB索引機(jī)制2)查詢索引>db.ct.getIndexes();查看總索引記錄大小>db.ct.totalIndexSize();刪除索引,也適用全文索引刪除>db.ct.dropIndex("Name_1");以下命令執(zhí)行完后,除了默認(rèn)創(chuàng)建的-id索引外,ct集合其他索引將全部刪除。>db.ct.dropIndexes();5.2.4MongoDB索引機(jī)制全文索引操作使用createIndex函數(shù)創(chuàng)建全文索引時,需要對字符串類型或字符串?dāng)?shù)組類型的字段指定創(chuàng)建"text"類型的索引,如下示例>db.reviews.createIndex({comments:"text"})全文索引也可以基于多個字段建立復(fù)合索引。>db.reviews.createIndex({subject:"text",comments:"text"

})有時在不確定哪些字段是文本類型時,也可以使用“$**"(wildcardspecifier)通配說明符對所有文本類型字段創(chuàng)建全文索引,如下示例

>db.collection.createIndex({"$**":"text"})5.2.4MongoDB索引機(jī)制全文索引操作(續(xù))對于創(chuàng)建全文索引后的集合,find方法利用索引示例如下。①查詢包含"bad"的文檔。

>db.collection.find({$text:{$search:"bad"}})②查詢包含"bad"或者"spoiled"的文檔,查詢參數(shù)中用空格間隔開多個關(guān)鍵詞即可。

>db.collection.find({$text:{$search:"badspoiled"}})③查詢包含"bad"不包含"ok"的文檔,在不需要包含的關(guān)鍵詞前加符號"-"。

>db.collection.find({$text:{$search:"bad-ok"}})④查詢包含"notok"完整詞組的文檔,在完整詞組前后用引號括起來。

>db.collection.find({$text:{$search:"\"notok\""}})

5.2.4MongoDB索引機(jī)制地理位置索引MongoDB的地理位置索引可以在包含地理空間形狀和點(diǎn)集的集合上高效地執(zhí)行空間查詢。地理位置索引支持是MongoDB的一大亮點(diǎn),這也是目前很多流行的基于位置的服務(wù)(LocationBasedService,LBS)平臺選擇MongoDB的原因之一??臻g位置存儲:經(jīng)度:合法的經(jīng)度坐標(biāo)取值范圍為[-180,180],正為東經(jīng),負(fù)為西經(jīng);緯度:坐標(biāo)取值范圍為[-90,90],正為北緯,負(fù)為南緯5.2.4MongoDB索引機(jī)制地理位置索引一般分為以下兩種

①2d索引:用于存儲和查找平面上的點(diǎn),稱為平面地理位置索引;②2dsphere索引:用于存儲和查找球面上的點(diǎn),稱為球面地理位置索引。MongoDB只支持每個集合一個地理空間索引。創(chuàng)建語法如下。其中2d可替換成2dsphere。

>db.collection.createIndex({<locationfield>:"2d"})示例:>db.restaurants.createIndex({location:"2dsphere"})地理位置查詢既可以使用平面幾何,也可以使用球面幾何,根據(jù)使用的查詢和索引類型來決定。2dsphere索引只支持球面幾何,而2d索引同時支持平面和球面幾何。5.2.4MongoDB索引機(jī)制常用地理位置查詢操作符5.2.4MongoDB索引機(jī)制查詢類型幾何類型備注$near(GeoJSON點(diǎn),2dsphere索引)

球面某鄰域范圍內(nèi)文檔$near(傳統(tǒng)坐標(biāo),2d索引)

平面某鄰域范圍內(nèi)文檔$nearSphere(GeoJSON點(diǎn),2dsphere索引)球面某鄰域范圍內(nèi)文檔$nearSphere(傳統(tǒng)坐標(biāo),2d索引)球面可使用GeoJSON點(diǎn)替換$geoWithin:{$geometry:...} 球面某區(qū)域范圍內(nèi)文檔$geoWithin:{$box:...} 平面矩形區(qū)域內(nèi)文檔$geoWithin:{$polygon:...} 平面多邊形區(qū)域內(nèi)文檔$geoWithin:{$center:...} 平面某圓形區(qū)域內(nèi)文檔$geoWithin:{$centerSphere:...} 球面某點(diǎn)球面距離區(qū)域內(nèi)文檔$geoIntersects:{$geometry:...}

球面鄰近區(qū)域范圍內(nèi)文檔GeoJSON:是一種基于JSON的地理空間數(shù)據(jù)交換格式,它定義了一些不同類型的JSON對象以及它們的組織方式,用于表達(dá)地理特性、屬性和空間范圍。GeoJSON使用WGS84(WorldGeodeticSystem1984)作為地理坐標(biāo)參考系統(tǒng),并以10進(jìn)制方式表示。GeoJSON文檔中使用type字段來指定GeoJSON對象類型,如點(diǎn)、線、面、多點(diǎn)、多線、多面和幾何集合等,使用coordinates對象來指定對象的坐標(biāo),基本語法格式如下。

{type:"<GeoJSONtype>",coordinates:<coordinates>}示例:(1)點(diǎn){type:"Point",coordinates:[40,5]}(2)線{type:"LineString",coordinates:[[40,5],[41,6]]}5.2.4MongoDB索引機(jī)制5.2.4MongoDB索引機(jī)制地理位置查詢示例db.places.insert({name:"CentralPark",location:{type:"Point",coordinates:[-73.97,40.77]},category:"Parks"});db.places.insert({name:"SaraD.RooseveltPark",location:{type:"Point",coordinates:[-73.9928,40.7193]},category:"Parks"});db.places.insert({name:"PoloGrounds",location:{type:"Point",coordinates:[-73.9375,40.8303]},category:"Stadiums"});db.places.createIndex({location:"2dsphere"})db.places.find({location:{$near:{$geometry:{type:"Point",coordinates:[-73.9667,40.78]},$minDistance:1000,$maxDistance:5000}}})重點(diǎn)掌握以下內(nèi)容分片機(jī)制與集群架構(gòu)數(shù)據(jù)冗余復(fù)制集分布式文件存儲Journaling日志功能目錄MongoDB基礎(chǔ)1MongoDB文檔操作技術(shù)基礎(chǔ)2MongoDB數(shù)據(jù)庫集群架構(gòu)3MongoDB管理與監(jiān)控4小結(jié)547MongoDB官網(wǎng):/5.3.1分片機(jī)制與集群架構(gòu)MongoDB分片機(jī)制的集群技術(shù)架構(gòu)Shard:用于存儲實際的數(shù)據(jù)塊,實際生產(chǎn)環(huán)境中一個Shard角色可由幾臺機(jī)器組成一個replicaset(復(fù)制集)承擔(dān),防止主機(jī)單點(diǎn)故障。RouterMongos:前端路由,客戶端由此訪問接入,整個集群看上去像單一數(shù)據(jù)庫,前端應(yīng)用可以透明訪問分布集群中的數(shù)據(jù)。ConfigServer:配置服務(wù)器存儲整個Cluster元數(shù)據(jù),包括分塊(chunk)信息。485.3.1分片機(jī)制與集群架構(gòu)MongoDB中數(shù)據(jù)的分片是以集合為基本單位的,集合中的數(shù)據(jù)通過片鍵(ShardKey)被分成多個部分。片鍵對應(yīng)集合中的一個或多個字段,片鍵的值作為數(shù)據(jù)拆分的依據(jù)。選擇的片鍵要求每個文檔都必須包含。一個好的片鍵對分片至關(guān)重要。片鍵必須有索引。相同片鍵值的文檔一定會處于同一個塊(Chunk)中片鍵的選擇主要有兩個原則1)片鍵基數(shù)大(片鍵范圍):可能取值要盡可能多,也就是基數(shù)一定要大2)片鍵分布情況:盡可能選擇取值分布均勻的字段做片鍵5.3.2數(shù)據(jù)冗余復(fù)制集MongoDB的復(fù)制集群至少需要兩個節(jié)點(diǎn)。其中一個是主節(jié)點(diǎn),負(fù)責(zé)處理客戶端請求,其余的都是從節(jié)點(diǎn),負(fù)責(zé)復(fù)制主節(jié)點(diǎn)上的數(shù)據(jù)。常見的搭配方式為一主一從或一主多從。寫入操作都在主節(jié)點(diǎn)上,主節(jié)點(diǎn)記錄在其上的所有操作,存儲為opLog日志文件50MongoDB復(fù)制集支持主從式分布式部署MongoDB復(fù)制就是將數(shù)據(jù)同步到多個服務(wù)器的過程。5.3.2數(shù)據(jù)冗余復(fù)制集MongoDB中只能通過主節(jié)點(diǎn)將Mongo服務(wù)添加到副本集中。判斷當(dāng)前運(yùn)行的Mongo服務(wù)是否為主節(jié)點(diǎn)可以使用命令db.isMaster()。復(fù)制集通過replSetInitiate命令,或MongoShell的rs.initiate()進(jìn)行初始化,初始化后各個成員間開始發(fā)送心跳消息,并發(fā)起Primary選舉操作,獲得“大多數(shù)”成員投票支持的節(jié)點(diǎn),會成為Primary,其余節(jié)點(diǎn)成為Secondary。51Arbiter節(jié)點(diǎn)只參與投票,不能被選為Primary,并且不從Primary同步數(shù)據(jù)。Arbiter本身不存儲數(shù)據(jù),是非常輕量級的服務(wù)。5.3.3分布式文件存儲MongoDB提供了基于文件的分布式存儲系統(tǒng)GridFS。GridFS用于存儲和恢復(fù)那些超過16MB(BSON文件限制)的文件,如圖片、音頻、視頻等。GridFS也是文件存儲的一種方式,它存儲在MongoDB的集合中。GridFS會將大文件對象分割成多個小的數(shù)據(jù)塊,即文件片段,一般每個數(shù)據(jù)塊默認(rèn)為255KB,作為MongoDB的一個文檔存儲在chunks集合中。

GridFS用兩個集合來存儲一個文件:fs.files與fs.chunks。bin文件夾中Mongofiles.exe是一個GridFS管理工具,可實現(xiàn)二進(jìn)制文件的存取。525.3.3分布式文件存儲如添加文件操作可用mongofiles命令實現(xiàn):

>mongofiles-dgridfsputsong.mp3

其中g(shù)ridfs是存儲文件的數(shù)據(jù)庫名稱。如果不存在該數(shù)據(jù)庫,MongoDB會自動創(chuàng)建。song.mp3是上傳的音頻文件名。查看數(shù)據(jù)庫中GridFS文件的命令示例如下:>db.fs.files.find()以上命令執(zhí)行后返回以下文檔數(shù)據(jù):

{_id:ObjectId('534a811bf8b4aa4d33fdf94d'),filename:"song.mp3",chunkSize:261120,uploadDate:newDate(1397391643474),

md5:"e4f53379c909f7bed2e9d631e15c1c41",length:10401959

}可以根據(jù)具體的文件_id值,獲取區(qū)塊的數(shù)據(jù),命令如下:>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})將會返回n個文檔的數(shù)據(jù),意味著mp3文件被存儲在這n個數(shù)據(jù)塊中。535.3.4Journaling日志功能

Journaling日志不同于普通的log,它是MongoDB中WiredTiger存儲引擎故障恢復(fù)一個非常重要的功能,保證了數(shù)據(jù)庫服務(wù)器在意外斷電、自然災(zāi)害下數(shù)據(jù)的完整性。日志功能使數(shù)據(jù)庫在意外故障后能夠快速恢復(fù)最近c(diǎn)heckpoint后數(shù)據(jù)更新操作。Journaling功能有兩個重要內(nèi)存視圖:privateview與sharedview這兩個視圖都是通過內(nèi)存映射來實現(xiàn)的,對privateview映射內(nèi)存的修改不會直接影響到磁盤上,而sharedview中數(shù)據(jù)的變化則會影響到磁盤上的文件,系統(tǒng)會周期性地刷新sharedview數(shù)據(jù)到磁盤上545.3.4Journaling日志功能sharedview在mongoDB啟動的過程中,操作系統(tǒng)會將磁盤上的數(shù)據(jù)文件映射到內(nèi)存中的sharedview,操作系統(tǒng)只是完成映射,并沒有立即加載數(shù)據(jù)到內(nèi)存,mongoDB會根據(jù)需要加載數(shù)據(jù)到sharedview。Privateview內(nèi)存視圖是為讀操作保存數(shù)據(jù)的位置,是mongodb保存新的寫操作的第一個地方。磁盤上的Journaling日志文件,是實現(xiàn)寫操作持久化保存的地方。mongoDB實例啟動時會讀這個文件。參考:/longshiyVip/p/5096086.html555.3.4Journaling日志功能例如以寫操作db.colection.insert({key,value})為例,寫操作發(fā)生的關(guān)鍵步驟如下。(1)首先將數(shù)據(jù)寫入privateview中,privateview并不與磁盤文件相連接,數(shù)據(jù)不會直接刷新到磁盤上。(2)將privateview中的數(shù)據(jù)批量復(fù)制到Journal該操作會周期性完成,啟動MongoDB時可通過mitIntervalMs來控制,默認(rèn)100ms。Journal會將寫操作記錄存儲到磁盤上的文件中,進(jìn)行持久化保存,Journal日志文件上的每一條都描述了寫操作更改了數(shù)據(jù)文件上的哪些字節(jié)。此時由于數(shù)據(jù)被寫入Journal中,即便MongoDB服務(wù)器崩潰了,寫操作仍然是安全的,當(dāng)數(shù)據(jù)庫重啟時,Mongod會先讀取Journal日志,將寫操作引起的變化重新同步到數(shù)據(jù)文件中。5.3.4Journaling日志功能(3)利用Journal日志中的寫操作記錄引起的數(shù)據(jù)文件變化更新sharedview中的數(shù)據(jù)。(4)重新利用sharedview來對privateview進(jìn)行映射,使其占用的內(nèi)存空間恢復(fù)到初始值,此時sharedview中的數(shù)據(jù)與磁盤變得不一致了,MongoDB周期性(參數(shù)storage.syncPeriodSecs,默認(rèn)60s)地將sharedview中的數(shù)據(jù)flush到磁盤,進(jìn)行數(shù)據(jù)同步。(5)執(zhí)行完數(shù)據(jù)同步后,通知Journal日志已經(jīng)刷入,一旦Journal日志文件只包含全部刷入的寫操作,不再用于恢復(fù),MongoDB會將它刪除或者作為一個新的日志文件再次使用。重點(diǎn)掌握以下內(nèi)容文檔數(shù)據(jù)導(dǎo)入與導(dǎo)出文檔數(shù)據(jù)備份與恢復(fù)多文檔事務(wù)管理數(shù)據(jù)庫監(jiān)控目錄MongoDB基礎(chǔ)1MongoDB文檔操作技術(shù)基礎(chǔ)2MongoDB數(shù)據(jù)庫集群架構(gòu)3MongoDB管理與監(jiān)控4小結(jié)558MongoDB官網(wǎng):/59

MongoDB提供了mongoexport工具,可以把一個collection導(dǎo)出成json格式或csv格式的文件。可以指定導(dǎo)出哪些數(shù)據(jù)項,也可以根據(jù)給定的條件導(dǎo)出數(shù)據(jù)。-h[--host]-u[--username]argusername-p[--password]argpassword-d[--db]argdatabasetouse-c[--collection]argcollectiontouse(somecommands)-f[--fields]如-fname,age

-q[--query]argqueryfilter,asaJSONstring--csvexporttocsvinsteadofjson

-o[--out]

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論