




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
北京傳智播客教育mongodb講師:吳英雷
什么是NOSQL?nosql(notonlysql)是指非關(guān)系型數(shù)據(jù)庫,與關(guān)系型數(shù)據(jù)庫不同,它不支持SQL語句,通常以key-value形式存儲數(shù)據(jù),沒有表結(jié)構(gòu)。主要特點:非關(guān)系型、分布式、易于水平擴展等。高并發(fā)讀寫的性能大數(shù)據(jù)量的擴展(分布式存儲)配置簡單靈活、高效的操作與數(shù)據(jù)模型低廉的成本優(yōu)勢不足之處沒有統(tǒng)一的標(biāo)準(zhǔn)沒有正式的官方支持各種產(chǎn)品還不算成熟NoSQL的優(yōu)缺點新浪微博RedisGoogle BigtableAmazon SimpleDB淘寶數(shù)據(jù)平臺 Tair優(yōu)酷視頻 MongoDB飛信空間 HandlerSocket視覺中國網(wǎng)站 MongoDBNoSQL產(chǎn)品的使用情況主要目標(biāo):性能與擴展(分布式存儲)面向文檔的數(shù)據(jù)庫無模式(無須建表、也無須建數(shù)據(jù)庫)以BSON格式存儲數(shù)據(jù)javascript做為操作語言支持多種語言:php、python、java、c++等支持GridFS(大文件存儲)MongoDB簡介與MYSQL的性能比較分別插入100萬條記錄,并對其做100個用戶并發(fā)查詢操作數(shù)據(jù)存儲在硬盤中,默認(rèn)存儲在/data/db(C:/data/db)中。test數(shù)據(jù)庫生成文件:一個ns文件:test.ns(16M)多個數(shù)據(jù)文件:test.0(16M),test.1(32M),test.2(64M)...
即每一個數(shù)據(jù)文件是前一個數(shù)據(jù)文件的2倍。在32位系統(tǒng)上,數(shù)據(jù)庫文件總共不能超過2G,否無法再插入數(shù)據(jù)。推薦使用64位操作系統(tǒng)。MongoDB存儲方式MongoDB中以文檔的方式存取記錄,如一條記錄格式如下: {
“username”:”Tom”,“age”:10
}{"username":"Tom","age":"10"}{“Username”:”Tom”,”age”:10}注意:1.以上是兩個不同的文檔,MongoDB區(qū)分大小寫的數(shù)據(jù)類型,第一個age字段是數(shù)字類型,第二個age是字符串類型。2.每一個文檔尺寸不能超過16M
MongoDB是面向文檔的數(shù)據(jù)庫無模式是指,在同一個集合中可以包含不同格式的文檔,如:{"Name":"Mongodb","Type":"Nosql"}{"UserName":"Tom","age":20,"Gender":"male"}以上兩個文檔可以放在同一個集合中。在Mysql需要先建表再插入數(shù)據(jù),MongoDB中的集合不用創(chuàng)建、沒有結(jié)構(gòu),所以可以放不同格式的文檔。MongoDB的無模式(模式自由)Mongodb中的數(shù)據(jù)庫和Mysql中的數(shù)據(jù)為概念類似,只是無需創(chuàng)建。一個數(shù)據(jù)庫中可以有多個集合。一個集合中可以有多個文檔。Mongodb中保留以下數(shù)據(jù)庫:admin:總管理員的數(shù)據(jù)庫local:本地數(shù)據(jù)庫,不會被復(fù)制config:分片時的配置數(shù)據(jù)庫MongoDB中的數(shù)據(jù)庫MongoDB與Mysql概念對應(yīng)關(guān)系Mongodbmysql文檔(document)(單個文檔最大16M)記錄(row)集合(collection)表(table)數(shù)據(jù)庫(database)(32位系統(tǒng)上,一個數(shù)據(jù)庫的文件大小不能超過2G)數(shù)據(jù)庫(database)_id和ObjectId每個文檔都有一個_id字段,并且同一集合中的_id值唯一,該字段可以是任意類型的數(shù)據(jù),默認(rèn)是一個ObjectId對象。ObjectId是一個占12如:{"_id":ObjectId("513b22092f9cc03b7523ea77"),"name":"abc"}
MongoDB中的ObjectID類型MongoDB能運行在Linux,window,ios平臺上,支持32位、64位系統(tǒng),默認(rèn)使用端口27017和28017(在數(shù)據(jù)庫的端口號上加1000)(http管理端口,可關(guān)閉)。管理頁面:MongoDB支持網(wǎng)絡(luò)操作1.到Mongodb官方網(wǎng)站下載相關(guān)版本壓縮包2.解壓縮文件3.創(chuàng)建C:/data/db目錄(默認(rèn)用來存數(shù)據(jù)文件的目錄)3.打開命令行窗口XP:(開始-》程序-》附件-》命令提示行)win7(開始-》程序-》附件-》右鍵命令提示行-》以管理員方式運行)4.拖動解壓縮目錄中的mongod.exe到命令行窗口中執(zhí)行啟動后服務(wù)器默認(rèn)監(jiān)聽27017端口。另外還會啟動一個http的管理頁面,監(jiān)聽端口為服務(wù)器端口號加1000,如啟動MongoDB服務(wù)器(windows)安裝為系統(tǒng)服務(wù)Mongod.exe--install--dbpath數(shù)據(jù)目錄--logpath日志文件安裝為系統(tǒng)服務(wù),開機自動啟動(windowx)查看系統(tǒng)服務(wù)方法:在cmd中運行services.msc,打開服務(wù)窗口如果是WIN7的話,要以管理員的方式打開dos窗口缷載與重裝系統(tǒng)服務(wù)(windows)缷載(從系統(tǒng)服務(wù)中刪除)
Mongod.exe--remove--dbpath:數(shù)據(jù)存放目錄--logpath:日志文件路徑--bind_ip:綁定IP地址--port:監(jiān)聽端口號,默認(rèn)27017--maxConns:最大并發(fā)連接數(shù)--logappend:日志追加到現(xiàn)有日志文件中,而不是覆蓋--keyFile:復(fù)制數(shù)據(jù)時使用的私有key--auth:安全模式運行,登錄時需要用戶名密碼。--cpu:定期顯示CPU和IO的利用率--directoryperdb:每個數(shù)據(jù)庫中的數(shù)據(jù)存在一個單獨的目錄中--journal:啟動日志--nohttpinterface:不啟動WEB服務(wù)器接口--noscripting:關(guān)閉shell--repair:修復(fù)所有的數(shù)據(jù)庫--nssize:每個數(shù)據(jù)庫的.ns文件的尺寸,默認(rèn)是16M--help:查看所有的參數(shù)項mongod常用參數(shù)Mongo.exe
默認(rèn)連接本機的27017,如果要連接其他服務(wù)器,可以執(zhí)行: mongo.exeip地址:端口號/數(shù)據(jù)庫名(默認(rèn)連接test數(shù)據(jù)庫)
如: mongo.exelocalhost:27017/abc-->連接本地27017端口,abc數(shù)據(jù)庫
注:可以通過mongo.exe–help查看更多命令連接MongoDB服務(wù)器通過mongo.exe連接到服務(wù)器,然后運行useadmin
切換到admin數(shù)據(jù)庫db.shutdownServer()
執(zhí)行admin數(shù)據(jù)庫的shutdownServer()關(guān)閉MongoDB服務(wù)器在shell中默認(rèn)存在db變量,該變量代表當(dāng)前數(shù)據(jù)庫,如:例1:查看當(dāng)前使用的是哪個數(shù)據(jù)庫:shell中的db變量例2:切換數(shù)據(jù)庫,可以切換到一個不存在的數(shù)據(jù)庫,相當(dāng)于創(chuàng)建。命令:use數(shù)據(jù)庫名。如:1.系統(tǒng)級幫助命令:help。如:shell中的幫助系統(tǒng)2.查看數(shù)據(jù)庫上可用的操作命令:db.help()。如:shell中的幫助系統(tǒng)3.查看集合上可用的操作命令:db.集合名.help()。如:shell中的幫助系統(tǒng)插入數(shù)據(jù)例:向test數(shù)據(jù)庫中的user集合中插入一個文檔:usetest;-->切換到test數(shù)據(jù)庫(db.user.insert{“username”:”Tom”,”age”:10});-->插入數(shù)據(jù)MongoDB的增、刪、改、查注:_id字段是系統(tǒng)自動生成的,也可以自己指定任何類型的字,但值不能重復(fù)。插入數(shù)據(jù)流程 1.客戶端檢查數(shù)據(jù)是否超長、是否非utf8字符 2.客戶端將數(shù)據(jù)轉(zhuǎn)換成BSON的形式,然后送入服務(wù)器。 3.服務(wù)器解析BSON 4.檢驗是含”_id”鍵 5.檢驗文檔不超過4MB/16M(1.8版本后升級為16M)。 6.放入數(shù)據(jù)庫MongoDB的增、刪、改、查null:用于表示空或不存在的字 {"x":null}布爾:有兩個值true,false {"x":true}32位整數(shù):shell中所有數(shù)字都是64位浮點數(shù),所以不能在shell中用64位整數(shù):不同用在shell中64位浮點數(shù):shell中的數(shù)字都是這種類型 {"pi":3.14}字符串:utf-8字符串 {“x":"abcafdafs"}MongoDB支持的數(shù)據(jù)類型對象id {"_id":ObjectId()}日期 {"d":newDate()}正則表達(dá)式 {"x":/^abc/i}代碼 {"x":function(){/********/}}二進(jìn)制數(shù)據(jù):如視頻文件MongoDB支持的數(shù)據(jù)類型未定義 {"a":undefined}數(shù)組 {"d":[1,2,3,4,5]}內(nèi)嵌文檔 {"x":{"y":"z"}}MongoDB支持的數(shù)據(jù)類型刪除數(shù)據(jù)
語法:remove(條件)
例:刪除user集合中年齡等于10的文檔 db.user.remove({“age”:10});
注:remove只是刪除掉記錄,集合和索引還在。 db.drop_collection(“user”),會刪除整個集合及索引,速度快。MongoDB的增、刪、改、查修改數(shù)據(jù)
語法:update(條件,數(shù)據(jù),是否新增,是否修改多條)
例:修改user集合中年齡等于10的修改為20 varu=db.user.findOne({“age”:10}); u.age=20; db.user.update({“age”:10},u)或db.user.save(u);Upsert:如果沒有滿足查詢條件的記錄的話,是否新創(chuàng)建這條記錄注:如果有多條記錄滿足{"age":10},只有第一條記錄會被修改。可以設(shè)置第四個參數(shù)為真修改所有的記錄。MongoDB的增、刪、改、查修改數(shù)據(jù)時容易出錯的地方如有這樣的數(shù)據(jù):{"_id":1,"username":"abc","age":20,"sex":"boy"}想要修改年齡為22歲,錯誤代碼如下:varu=db.user.update({"_id":1},{"age":22})記錄修改完之后變成:{"_id":1,"age":22}正確的方法:varu=db.user.find({"_id":1});-->取出記錄u.age=22; --》在原記錄基本上修改db.user.save(u)或db.user.update({"_id":1},u)基本操作-更新使用修改器$inc:加一個數(shù)字$set:修改某一個字段,如果該字段不存在就增這個字段例1把abc的年齡加2db.user.update({"name":"abc"},{"$inc":{"age":2}})例2修改abc的電話號碼為131111,如果沒有這個字段就新增這個字段db.user.update({"name":"abc"},
{"$set":{"tel":"131111"}})
MongoDB的增、刪、改、查修改數(shù)組$push:向數(shù)組中添加$pop:從數(shù)組的首或尾取出數(shù)據(jù)例1.向abc的好友中添加一個好友bcd。db.user.insert({"name":"abc","friend":[]})db.user.update({"name":"abc"},{"$push":{"friend":"bcd"}
})例2:從abc的好友中刪除最后一個好友db.user.update({"name":"abc"},{"$pop":{"friend":1}})例3:從abc的好友中刪除第一個好友db.user.update({"name":"abc"},{"$pop":{"friend":-1}})MongoDB的增、刪、改、查瞬間完成MongoDB中修改、刪除、更新都是瞬間完成的,即客戶端只把命令發(fā)給服務(wù)器,但不會檢查這條命令是否執(zhí)行成功??梢酝ㄟ^在執(zhí)行完每條命令之后執(zhí)行g(shù)etLastError來檢查是否成功!查詢所有數(shù)據(jù)命令:find(查詢條件,返回的鍵),如:db.user.find()-->查詢user集合中所有的數(shù)據(jù)db.user.find({"username":"Tom"})-->列出username=Tom的數(shù)據(jù)db.user.find({"age":20})-->列出age=20的數(shù)據(jù)MongoDB的增、刪、改、查查詢時只返回某幾個字段db.user.find({},{"age":1})-->列出所有人的age字段MongoDB的增、刪、改、查db.user.find({},{"age":0})-->除了age字段,其他字段都列出來常用操作符:$lt,$lte,$gt,$gte(<,<=,>,>=),$ne(<>),$in,$nin,$or,$not,$mod(取模),$exists,$whereMongodb中使用操作符查詢?nèi)纾翰樵兡挲g小于20歲的用戶db.user.find({"age":{"$lt":20}})常用操作符:OR,IN,ninMongodb中使用操作符查詢db.user.find({"age":{"$in":[10,20,30]}})db.user.find({"age":{"$nin":[10,20]}})-->年齡不是10,20歲的列出年齡小于10歲或者大于30歲的:age<10orage>30db.user.find({"$or":[{"age":{"$lt":10}},{"age":{"$gt":30}}]})常用操作符:mod(取模),notMongodb中使用操作符查詢年齡對3取模余1的:db.user.find({"age":{"$mod":[3,1]}})對上面的取反:db.user.find({"age":{"$not":{"$mod":[3,1]}}})常用操作符:$exists:判斷鍵是否存在Mongodb中使用操作符查詢判斷值為null時要注意:db.user.find({"friends":null})該命令不僅查出值為null的記錄,friends鍵不存在的記錄也會被取出來。如果想取出friends鍵存在,并且值為null的記錄應(yīng)該這樣來?。篸b.user.find({"friends":null,"$exists":1})常用操作符:$where:根據(jù)函數(shù)返回值來判斷Mongodb中使用操作符查詢?nèi)纾喝〕瞿挲g乘以10+5小于100的db.user.find("$where":function(){ return((this.age*10+5)<100);});this:代表當(dāng)前這個記錄。通過這個$where基本可以實現(xiàn)任意類型的查詢。不過不到必要時候不要用這個方法,因為它的速度比一般查詢要慢很多。例1:查找內(nèi)容中含有"php"的記錄。 db.user.find({“content”:
/abc/
})例2
:查找以名稱以abc開頭且不區(qū)分大小寫的記錄 db.user.find({"username":/^abc/i});Mongodb中使用正則$all:判斷某個字段包含多個值時。如:取出fruit中既有apple又有banana的記錄Mongodb查詢數(shù)組$size:判斷某個數(shù)組的尺寸。如:取出friut數(shù)組中有三個值的記錄:db.food.find({"fruit:{"$size":3}})$slice:返回一個數(shù)組的子集,格式:{$slice:10}--》數(shù)組中的前10個{$slice:-10}-->數(shù)組中的后10個{$slice:[20,10]}-->返回數(shù)組中第21~30的元素如:取出某人博客的前10個評論者:db.blog.find({"_id":1},{"comments":{"$slice":10}})Mongodb查詢數(shù)組$elemMatch如有這樣的數(shù)據(jù)結(jié)構(gòu):有個comments字段,該字段是一個數(shù)組,每一項是一個內(nèi)嵌的對象Mongodb內(nèi)嵌文檔查詢查詢內(nèi)嵌的文檔中score大于5的記錄:db.user.find({"comments":{"$elemMatch":{"score":{"$gt":5}}}})游標(biāo):find()函數(shù)的返回結(jié)果是一個游標(biāo)。操作如下:循環(huán)插入100條記錄:vari;for(i=0;i<100;i++){ db.numb.insert({"age":i});}varcursor=db.numb.find();-->查詢所有記錄返回一個游標(biāo)。循環(huán)游標(biāo)輸出記錄:while(cursor.hasNext()){ t=cursor.next(); print(t.age);}總結(jié):游標(biāo)的兩個方法
hasNext():判斷有沒有下一條記錄
next():取出下一條記錄Mongodb中的游標(biāo)限制與聚合Limit:限制記錄條件Skip:忽略前N條記錄Sort:排序-1(降序)1(升序)Count:記錄數(shù)例:取出前50個MP3,并且根據(jù)價格降序排序:db.songs.find({“type”:”Mp3”}).limit(50).sort({“price”:-1})Db.songs.find().count():總的記錄數(shù)Mongodb中的排序、限制查詢、記錄數(shù)(可用于制作翻頁功能)Distinct找出某集合中某個鍵的所有不重復(fù)的值。例:取出people集合中age字段所有不重復(fù)的值mand({"distinct":"people","key":"age"});Mongodb
創(chuàng)建索引
ensureIndex({“username”:1})
ensureIndex({“username”:1}
,
{“unique”:true})-->唯一索引例1:為了加速查詢速度,為姓名字段建立索引。db.user.ensureIndex({"username":1})例2:為了加快排序速度,為年齡字段建立降序索引。db.user.ensureIndex({"age":-1})----->
{"age":1}是升序例3:在username字段上創(chuàng)建唯一索引,索引名稱叫uidb.user.ensureIndex({“username”:1},
{“unique”:true},{“name”:”ui”})Mongodb中管理索引查看與刪除索引getIndexes()dropIndexes()dropIndex(name)例1:查看user集合上的索引db.user.getIndexes()例2:刪除user集合上,年齡字段的索引db.user.dropIndex(age)例3:刪除user集合上所有的索引db.user.dropIndexes();Mongodb中管理索引添加、修改賬號,登錄db.addUser(用戶名,密碼,是否只讀)db.auth(用戶名,密碼)-->登錄例:添加一個管理員用戶 useadmin選擇管理員數(shù)據(jù)庫 db.addUser(“root”,”1234”)-->把用戶添加到admin庫中例2.向sns數(shù)據(jù)庫中添加一個只讀的普通用戶 usesns db.addUser(“test2”,”1234”,true)只讀用戶注:用戶要屬于某一個數(shù)據(jù)庫!Mongodb管理–賬號查看賬號、刪除賬號db.system.users.find()db.system.users.remove({“user”:”test”})刪除test賬號重新以驗證模式啟動mongod,只有在驗證模式賬號才會生效,并且必須要先有一個管理員賬號 mongod.exe--auth
Mongodb管理–賬號固定集合是一種尺寸固定的環(huán)形的集合,按照順序一個一個數(shù)據(jù)插入,當(dāng)集合數(shù)據(jù)滿了之后,再繼續(xù)插入會覆蓋掉前面的數(shù)據(jù),繼續(xù)掉入。CappedCollection固定集合按順序插入滿了之后覆蓋前面的固定集合特點。
不能刪除, 更新不能導(dǎo)致文檔移動(修改后數(shù)據(jù)不能超過原數(shù)據(jù)尺寸) 沒有任務(wù)索引 存儲順序就是插入順序 插入速度極快 按同樣順序查詢極快 自動淘汰舊的數(shù)據(jù)CappedCollection固定集合創(chuàng)建固定集合。db.createCollection("name",{capped:true,size:1024,max:100});size:集合的尺寸,單位字節(jié)max:集合中最大的記錄數(shù)淘汰機制主依據(jù)size,即在尺寸沒有滿時才會依據(jù)max來工作。轉(zhuǎn)換普通集合為固定集合mand(convertToCapped:"test","size":100000);自然排序:按插入的順序排序db.collection.find().sort({"$natural":1})db.collection.find().sort({"$natural":-1})--》相反插入順序CappedCollection固定集合GridFS是建立在普通文檔基本上的輕量級的文件存儲規(guī)范?;舅悸肥?. 把大的文件分成很多塊,每塊作為一個單獨的文檔存儲,這樣就可以存儲大文件。2.沒有碎片3.支持復(fù)制與分片功能。4.使用fs.files和fs.chunks集合存儲數(shù)據(jù)。GridFS基本原理GridFS用來在Mongodb中存儲文件。主要使用mongofiles.exe命令來完成文件的上傳、下載、刪除等功能??捎妹睿簃ongofiles.exeputtest.txt-->將test.txt放入mongodbmongofiles.exelistmongofiles.exesearchfilenamemongofiles.exegetfilenamemongofiles.exedeletefilenameGridFS簡介查看服務(wù)器狀態(tài) mand({“serverStatus”:1})使用第三方監(jiān)聽插件 nagios munin ganglia cactiMongodb管理–監(jiān)控復(fù)制:將主機數(shù)據(jù)復(fù)制到其他機器上。主要用于備份、故障恢復(fù)、讀擴展等。(不同服務(wù)器數(shù)據(jù)相同)Mongodb的其他高級功能abcd主從從abcdabcdabcd插入復(fù)制復(fù)制分片:分布式存儲(易于擴展)Mongodb的分片abcdabcd插入1.啟動主服務(wù)器(a電腦) mongod.exe--master--bind_ip11--port27017--dbpath數(shù)據(jù)目錄--logpath日志目錄2.啟動從服務(wù)器(b電腦)mongod.exe--slave
--source11:27017--dbpath數(shù)據(jù)目
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 化工工藝知識培訓(xùn)課件
- 醫(yī)院污水應(yīng)急演練
- 區(qū)塊鏈公司發(fā)展報告范文
- 請求撤銷科室的報告范文
- 2025年度茶葉種植基地土地流轉(zhuǎn)與租賃合同
- 2025年度智慧農(nóng)業(yè)項目變更合同聲明及條件細(xì)化
- 玉米種植戶與農(nóng)業(yè)保險公司合作協(xié)議(2025年度)
- 2025年度水產(chǎn)品電商平臺與電商平臺服務(wù)商合作協(xié)議
- MySQL教程(新體系-綜合應(yīng)用實例視頻)(第4版)習(xí)題及答案 -第02章
- 二零二五年度地下車庫車位使用權(quán)附帶車位清潔服務(wù)合同
- 2025年黑龍江旅游職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫含答案
- 工藝技術(shù)人員工作總結(jié)
- 醫(yī)院護理人文關(guān)懷實踐規(guī)范專家共識課件
- DeepSeek在自然災(zāi)害預(yù)警中的潛力
- 2025年專利技術(shù)保密協(xié)議書模板
- 個人合伙開店合同范本
- 2025年江西省高職單招《職業(yè)適應(yīng)性測試》高頻必練考試題庫400題(帶答案)
- 2024年設(shè)備監(jiān)理師考試題庫及答案參考
- 2025年一次性死亡賠償協(xié)議模板(2篇)
- 第6課 識別界限 拒絕性騷擾 課件 2024-2025學(xué)年人教版(2024)初中體育與健康七年級全一冊
- 【MOOC】《思想道德與法治》(東南大學(xué))章節(jié)中國大學(xué)慕課答案
評論
0/150
提交評論