1. MongoDB 簡(jiǎn)介
MongoDB是一個(gè)可擴(kuò)展的高性能择克,開源宾毒,模式自由幻捏,面向文檔的NoSQL盆犁,基于分布式文件存儲(chǔ),由 C++ 語言編寫篡九,設(shè)計(jì)之初旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案谐岁。
2. MongoDB特點(diǎn)
模式自由 :可以把不同結(jié)構(gòu)的文檔存儲(chǔ)在同一個(gè)數(shù)據(jù)庫里
面向集合的存儲(chǔ):適合存儲(chǔ) JSON風(fēng)格文件的形式,
完整的索引支持:對(duì)任何屬性可索引榛臼,
復(fù)制和高可用性:支持服務(wù)器之間的數(shù)據(jù)復(fù)制伊佃,支持主-從模式及服務(wù)器之間的相互復(fù)制。復(fù)制的主要目的是提供冗余及自動(dòng)故障轉(zhuǎn)移沛善。
自動(dòng)分片:支持水平的數(shù)據(jù)庫集群航揉,可動(dòng)態(tài)添加額外的機(jī)器。
豐富的查詢:支持豐富的查詢表達(dá)方式金刁,查詢指令使用JSON形式的標(biāo)記帅涂,可輕易查詢文檔中的內(nèi)嵌的對(duì)象及數(shù)組议薪。
快速就地更新:查詢優(yōu)化器會(huì)分析查詢表達(dá)式,并生成一個(gè)高效的查詢計(jì)劃媳友。
高效的傳統(tǒng)存儲(chǔ)方式:支持二進(jìn)制數(shù)據(jù)及大型對(duì)象(如圖片等...)斯议。
3. MongoDB與SQL區(qū)別
4. 適用場(chǎng)景
網(wǎng)站數(shù)據(jù): 適合實(shí)時(shí)的插入,更新與查詢庆锦,并具備網(wǎng)站實(shí)時(shí)數(shù)據(jù)存儲(chǔ)所需的復(fù)制及高度伸縮性。
緩存: 由于性能很高轧葛,也適合作為信息基礎(chǔ)設(shè)施的緩存層搂抒。在系統(tǒng)重啟之后,搭建的持久化緩存可以避免下層的數(shù)據(jù)源過載尿扯。
大尺寸求晶、低價(jià)值的數(shù)據(jù): 使用傳統(tǒng)的關(guān)系數(shù)據(jù)庫存儲(chǔ)一些數(shù)據(jù)時(shí)可能會(huì)比較貴,在此之前衷笋,很多程序員往往會(huì)選擇傳統(tǒng)的文件進(jìn)行存儲(chǔ)芳杏。
高伸縮性的場(chǎng)景: 非常適合由數(shù)十或者數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫。
用于對(duì)象及JSON數(shù)據(jù)的存儲(chǔ): MongoDB的BSON數(shù)據(jù)格式非常適合文檔格式化的存儲(chǔ)及查詢辟宗。
5. MongoDB的安裝與使用
1. MongoDB官網(wǎng)安裝包下載地址:http://www.mongodb.org/downloads
MongoDB安裝文檔:https://docs.mongodb.com/getting-started/shell/installation/
Ubuntu下安裝MongoDB:
python@ubuntu:~$ sudo apt-get install mongodb
注意:使用MongoDB爵赵,需要先啟動(dòng)服務(wù)端,再使用客戶端連接數(shù)據(jù)庫泊脐。
2. 服務(wù)端
MongoDB 默認(rèn)的存儲(chǔ)數(shù)據(jù)目錄為 /data/db空幻,默認(rèn)端口27017
服務(wù)的命令為mongod,可以通過help查看所有參數(shù)
python@ubuntu:~$ mongod --help
相關(guān)文件存放路徑:默認(rèn)各個(gè)文件存放路徑如下所示:
可執(zhí)行文件存放路徑:/usr/bin/mongod和/usr/bin/mongo
數(shù)據(jù)庫文件存放路徑:/data/db
日志文件存放路徑:/var/log/mongodb/mongod.log
配置文件存放路徑:/etc/mongod.conf
3. 啟動(dòng)注意事項(xiàng)
1. 首次啟動(dòng):
啟動(dòng)MongoDB服務(wù):sudo mongod
報(bào)出如下錯(cuò)誤容客,表示默認(rèn)的存儲(chǔ)數(shù)據(jù)目錄 /data/db 不存在:
[initandlisten] exception in initAndListen: 29 Data directory /data/db not found., terminating
創(chuàng)建 /data目錄和 /data/db 目錄秕铛,并指定 讀/寫/執(zhí)行 權(quán)限
python@ubuntu:~$ sudo mkdir -p /data/db
python@ubuntu:~$ sudo chmod777/data/db
2. 再次啟動(dòng):
再次啟動(dòng)MongoDB服務(wù):sudo mongod
啟動(dòng)成功,但是可能會(huì)有三個(gè)warning的警告
Warning 1:
[initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.[initandlisten] ** We suggest setting it to 'never'[initandlisten][initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.[initandlisten] ** We suggest setting it to 'never'
Linux的內(nèi)存分配默認(rèn)由內(nèi)核動(dòng)態(tài)分配缩挑,而不是由程序自行管理但两。而MongoDB對(duì)內(nèi)存占用有那么點(diǎn)...嚴(yán)重,所以為了防止MongoDB占用內(nèi)存過大而被內(nèi)核"管理"供置,官方推薦關(guān)閉動(dòng)態(tài)分配谨湘。
默認(rèn)"always"表示允許動(dòng)態(tài)分配,對(duì)應(yīng)的"never"就是不允許芥丧,所以我們將這兩個(gè)文件內(nèi)容修改為"naver"后就沒有warning了悲关。
# Ctrl + c 退出 MongoDB 數(shù)據(jù)庫服務(wù)# 然后進(jìn)入 root 用戶下,執(zhí)行修改命令python@ubuntu:~$ sudo su[sudo] python 的密碼: root@ubuntu:~# sudo echo "never" > /sys/kernel/mm/transparent_hugepage/enabledroot@ubuntu:~# sudo echo "never" >? /sys/kernel/mm/transparent_hugepage/defrag
實(shí)際上娄柳,除非網(wǎng)站DBA對(duì)數(shù)據(jù)庫性能有極限要求寓辱,在通常情況下系統(tǒng)動(dòng)態(tài)分配的內(nèi)存頁大小足夠我們正常使用,而且更能優(yōu)化整個(gè)系統(tǒng)赤拒,所以一般不必理會(huì)這個(gè)warning秫筏。而且這樣只是臨時(shí)修改Linux內(nèi)核的設(shè)置诱鞠,在Linux服務(wù)器重啟后則會(huì)失效。
Warning 2:
[initandlisten] ** WARNING: soft rlimits too low.rlimits set to 1024 processes, 64000 files. Number of processes should be at least 32000 : 0.5 times number of files.
這個(gè)WARNING(如果有的話)含義為: 表示默認(rèn)分配給MongoDB的進(jìn)程和文件數(shù)量限制過低这敬,需要重新分配值:
mongodb當(dāng)前限制:1024 processes, 64000 files
mongodb建議要求:processes = 0.5*files=32000(至少)
咱們學(xué)習(xí)階段默認(rèn)用不著這么多的進(jìn)程和文件航夺,所以也可以不必理會(huì)。
# 打開 相關(guān)配置文件:root@ubuntu:~# vi /etc/security/limits.conf# 在打開的 文件最下方崔涂,添加阳掐,然后保存退出mongod? soft? nofile64000mongod? hard? nofile64000mongod? soft? nproc32000mongod? hard? nproc32000
Warning 3:
[initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
意思是我們?cè)谟胷oot權(quán)限做這些事,理論上是不安全的冷蚂。我們可以通過附加--auth參數(shù)缭保,來使用用戶認(rèn)證來處理這個(gè)情況,這個(gè)后面會(huì)講到蝙茶。
3. 再再次啟動(dòng):
再再次啟動(dòng)MongoDB服務(wù):sudo mongod
啟動(dòng)后查看進(jìn)程艺骂,以確定是否啟動(dòng)成功
python@ubuntu:~$ ps aux | grep mongod
如果進(jìn)程中沒有mongod的項(xiàng)則沒有啟動(dòng)成功,可以通過查看日志來確定錯(cuò)誤原因隆夯,默認(rèn)日志文件為/var/log/mongodb/mongod.log钳恕,最新的信息在最后面顯示。
4. 客戶端
客戶端命令為mongo蹄衷,可以通過help查看所有參數(shù)忧额。
這個(gè)shell即是mongodb的客戶端,用來對(duì)MongoDB進(jìn)行操作和管理的交互式環(huán)境愧口。
python@ubuntu:~$ mongo --help
終端退出連接
> exit
6. MongoDB數(shù)據(jù)庫命令
1宙址、連接成功后,默認(rèn)使用test數(shù)據(jù)庫
查看當(dāng)前數(shù)據(jù)庫名稱
db
2调卑、查看所有數(shù)據(jù)庫名稱抡砂,列出所有在物理上存在的數(shù)據(jù)庫
show dbs
3、切換數(shù)據(jù)庫恬涧,如果數(shù)據(jù)庫不存在也并不創(chuàng)建注益,直到插入數(shù)據(jù)或創(chuàng)建集合時(shí)數(shù)據(jù)庫才被創(chuàng)建
use 數(shù)據(jù)庫名稱
4、刪除當(dāng)前指向的數(shù)據(jù)庫溯捆,如果數(shù)據(jù)庫不存在丑搔,則什么也不做
db.dropDatabase()
7. MongoDB集合命令
創(chuàng)建語法如下:
name是要?jiǎng)?chuàng)建的集合的名稱
options是一個(gè)文檔,用于指定集合的配置提揍,選項(xiàng)??參數(shù)是可選的啤月,所以只需要到指定的集合名稱
可以不手動(dòng)創(chuàng)建集合,向不存在的集合中第一次加入數(shù)據(jù)時(shí)劳跃,集合會(huì)被創(chuàng)建出來
db.createCollection(name, options)
例1:不限制集合大小
db.createCollection("stu")
例2:限制集合大小谎仲,后面學(xué)會(huì)插入語句后可以查看效果
參數(shù)capped:默認(rèn)值為false表示不設(shè)置上限,值為true表示設(shè)置上限
參數(shù)size:當(dāng)capped值為true時(shí)刨仑,需要指定此參數(shù)郑诺,表示上限大小夹姥,當(dāng)文檔達(dá)到上限時(shí),會(huì)將之前的數(shù)據(jù)覆蓋辙诞,單位為字節(jié)
db.createCollection("sub", { capped : true, size : 10 } )
查看當(dāng)前數(shù)據(jù)庫的集合
show collections
刪除命令
db.集合名稱.drop()
8.?MongoDB文檔命令
1.MongoDB的數(shù)據(jù)類型
Object ID:文檔ID
String:? 字符串辙售,最常用,必須是有效的UTF-8
Boolean:? 存儲(chǔ)一個(gè)布爾值飞涂,true或false
Integer:? 整數(shù)可以是32位或64位旦部,這取決于服務(wù)器
Double:? 存儲(chǔ)浮點(diǎn)值
Arrays:? 數(shù)組或列表,多個(gè)值存儲(chǔ)到一個(gè)鍵
Object:? 用于嵌入式的文檔较店,即一個(gè)值為一個(gè)文檔
Null:? ? 存儲(chǔ)Null值
Timestamp:時(shí)間戳士八,表示從1970-1-1到現(xiàn)在的總秒數(shù)
Date:? ? 存儲(chǔ)當(dāng)前日期或時(shí)間的UNIX時(shí)間格式
創(chuàng)建日期語句如下
注意:參數(shù)的格式為YYYY-MM-DD
new Date('2015-11-11')
object id
每個(gè)文檔都有一個(gè)屬性,為_id泽西,保證每個(gè)文檔的唯一性
可以自己去設(shè)置_id插入文檔
如果沒有提供曹铃,那么MongoDB為每個(gè)文檔提供了一個(gè)獨(dú)特的_id缰趋,類型為objectID
objectID是一個(gè)12字節(jié)的十六進(jìn)制數(shù):
前4個(gè)字節(jié)為當(dāng)前時(shí)間戳
接下來3個(gè)字節(jié)為機(jī)器ID
接下來的2個(gè)字節(jié)為MongoDB的服務(wù)進(jìn)程id
最后3個(gè)字節(jié)為簡(jiǎn)單的增量值
2.?MongoDB的數(shù)據(jù)增刪改查
1捧杉、插入語法:
db.集合名稱.insert(document)
插入文檔時(shí),如果不指定_id參數(shù)秘血,MongoDB會(huì)為文檔分配一個(gè)唯一的ObjectId
例1
db.stu.insert({name:'gj',gender:1})
例2
s1={_id:'2015111',name:'hr'}
s1.gender=0
db.stu.insert(s1)
2味抖、更新語法:
db.集合名稱.update(
? ? <query>,
? ? <update>,
?????{multi:boolean<>}
????)
參數(shù)query:查詢條件,類似sql語句update中where部分
參數(shù)update:更新操作符灰粮,類似sql語句update中set部分
參數(shù)multi:可選仔涩,默認(rèn)是false,表示只更新找到的第一條記錄粘舟,
值為true表示把滿足條件的文檔全部更新
例1:全文檔更新
db.stu.update({name:'hr'},{name:'mnc'})
例2:指定屬性更新熔脂,通過操作符$set
db.stu.insert({name:'hr',gender:0})
db.stu.update({name:'hr'},{$set:{name:'hys'}})
例3:修改多條匹配到的數(shù)據(jù)
db.stu.update({},{$set:{gender:0}},{multi:true})
3、保存語法:
db.集合名稱.save(document)
如果文檔的_id已經(jīng)存在則修改柑肴,如果文檔的_id不存在則添加
例1
db.stu.save({_id:'20160102','name':'yk',gender:1})
例2
db.stu.save({_id:'20160102','name':'wyk'})
4霞揉、刪除語法:
db.集合名稱.remove(
? ? query,
????{
????justOne:
????})
參數(shù)query:可選,刪除的文檔的條件
參數(shù)justOne:可選晰骑,如果設(shè)為true或1适秩,則只刪除一條,默認(rèn)false硕舆,表示刪除多條
例1:只刪除匹配到的第一條
db.stu.remove({gender:0},{justOne:true})
例2:全部刪除
db.stu.remove({})
9. MongoDB數(shù)據(jù)查詢
1秽荞、基本查詢:
方法find():查詢
db.集合名稱.find({條件文檔})
方法findOne():查詢,只返回第一個(gè)
db.集合名稱.findOne({條件文檔})
方法pretty():將結(jié)果格式化
db.集合名稱.find({條件文檔}).pretty()
2抚官、比較運(yùn)算符:
等于扬跋,默認(rèn)是等于判斷,沒有運(yùn)算符
小于$lt
小于或等于$lte
大于$gt
大于或等于$gte
不等于$ne
例1:查詢名稱等于'zhangsan'的學(xué)生
db.stu.find({name:'zhangsan'})
例2:查詢年齡大于或等于18的學(xué)生
db.stu.find({age:{$gte:18}})
3凌节、邏輯運(yùn)算符:
查詢時(shí)可以有多個(gè)條件胁住,多個(gè)條件之間需要通過邏輯運(yùn)算符連接
邏輯與:默認(rèn)是邏輯與的關(guān)系
例1:查詢年齡大于或等于18趁猴,并且性別為true的學(xué)生
db.stu.find({age:{$gte:18},gender:true})
邏輯或:使用$or,值為數(shù)組彪见,數(shù)組中每個(gè)元素為json
例2:查詢年齡大于18儡司,或性別為false的學(xué)生
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
and和or一起使用
例3:查詢年齡大于18或性別為true的學(xué)生,并且學(xué)生的姓名為gj
db.stu.find({$or:[{age:{$gte:18}},{gender:true}],name:'gj'})
4余指、范圍運(yùn)算符:
使用"$in"捕犬,"$nin" 判斷是否在某個(gè)范圍內(nèi)
例1:查詢年齡為18、28的學(xué)生
db.stu.find({age:{$in:[18,28]}})
5酵镜、支持正則表達(dá)式:
mongodb提供的終端shell碉碉,同時(shí)也是一個(gè)js的執(zhí)行器,可以編寫js的代碼和函數(shù)
使用//或$regex編寫正則表達(dá)式
例1:查詢姓黃的學(xué)生
db.stu.find({name:/^黃/})
db.stu.find({name:{$regex:'^黃'}}})
6淮韭、自定義查詢:
使用$where后面寫一個(gè)函數(shù)(js函數(shù))垢粮,返回滿足條件的數(shù)據(jù)
例1:查詢年齡大于30的學(xué)生
db.stu.find({$where:function(){return this.age>30;}})
10. MongoDB中l(wèi)imit與skip的應(yīng)用
limit
方法limit():用于讀取指定數(shù)量的文檔
語法:
db.集合名稱.find().limit(NUMBER)
參數(shù)NUMBER表示要獲取文檔的條數(shù)
如果沒有指定參數(shù)則顯示集合中的所有文檔
例1:查詢2條學(xué)生信息
db.stu.find().limit(2)
skip
方法skip():用于跳過指定數(shù)量的文檔
語法:
db.集合名稱.find().skip(NUMBER)
參數(shù)NUMBER表示跳過的記錄條數(shù),默認(rèn)值為0
例1:查詢從第3條開始的學(xué)生信息
db.stu.find().skip(2)
方法limit()和skip()可以一起使用靠粪,不分先后順序
創(chuàng)建數(shù)據(jù)集
for(i=0;i<15;i++){db.t1.insert({_id:i})}
查詢第5至8條數(shù)據(jù)
db.stu.find().limit(4).skip(5)
或
db.stu.find().skip(5).limit(4)
11.?MongoDB投影
定義:在查詢到的返回結(jié)果中蜡吧,只選擇必要的字段,而不是選擇一個(gè)文檔的整個(gè)字段
如:一個(gè)文檔有5個(gè)字段占键,需要顯示只有3個(gè)昔善,投影其中3個(gè)字段即可
語法:
參數(shù)為字段與值,值為1表示顯示畔乙,值為0不顯示
db.集合名稱.find({},{字段名稱:1,...})
對(duì)于需要顯示的字段君仆,設(shè)置為1即可,不設(shè)置即為不顯示
特殊:對(duì)于_id列默認(rèn)是顯示的牲距,如果不顯示需要明確設(shè)置為0
例1
db.stu.find({},{name:1,gender:1})
例2
db.stu.find({},{_id:0,name:1,gender:1})
12.?MongoDB排序
定義:方法sort()返咱,用于對(duì)結(jié)果集進(jìn)行排序
語法
db.集合名稱.find().sort({字段:1,...})
參數(shù)1為升序排列
參數(shù)-1為降序排列
例1:根據(jù)性別降序,再根據(jù)年齡升序
db.stu.find().sort({gender:-1,age:1})
13.?MongoDB統(tǒng)計(jì)個(gè)數(shù)
定義:方法count()用于統(tǒng)計(jì)結(jié)果集中文檔條數(shù)
語法
db.集合名稱.find({條件}).count()
也可以與為
db.集合名稱.count({條件})
例1:統(tǒng)計(jì)男生人數(shù)
db.stu.find({gender:true}).count()
例2:統(tǒng)計(jì)年齡大于20的男生人數(shù)
db.stu.count({age:{$gt:20},gender:true})
14.?MongoDB消除重復(fù)
方法distinct()對(duì)數(shù)據(jù)進(jìn)行去重
語法
db.集合名稱.distinct('去重字段',{條件})
例:查找年齡大于18的學(xué)生牍鞠,來自哪些省份
db.stu.distinct('hometown',{age:{$gt:18}})
15.?MongoDB聚合 aggregate
定義:聚合(aggregate)主要用于計(jì)算數(shù)據(jù)咖摹,類似sql中的sum()、avg()
語法:db.集合名稱.aggregate([{管道:{表達(dá)式}}])
管道:管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個(gè)命令的輸入
ps ajx | grep mongo
在mongodb中皮服,管道具有同樣的作用楞艾,文檔處理完畢后,通過管道進(jìn)行下一次處理
常用管道
$group:將集合中的文檔分組龄广,可用于統(tǒng)計(jì)結(jié)果
$match:過濾數(shù)據(jù)硫眯,只輸出符合條件的文檔
$project:修改輸入文檔的結(jié)構(gòu),如重命名择同、增加两入、刪除字段、創(chuàng)建計(jì)算結(jié)果
$sort:將輸入文檔排序后輸出
$limit:限制聚合管道返回的文檔數(shù)
$skip:跳過指定數(shù)量的文檔敲才,并返回余下的文檔
$unwind:將數(shù)組類型的字段進(jìn)行拆分
表達(dá)式:處理輸入文檔并輸出
語法:表達(dá)式:'$列名'
常用表達(dá)式
$sum:? 計(jì)算總和裹纳,$sum:1同count表示計(jì)數(shù)
$avg:? 計(jì)算平均值
$min:? 獲取最小值
$max:? 獲取最大值
$push:? 在結(jié)果文檔中插入值到一個(gè)數(shù)組中
$first: 根據(jù)資源文檔的排序獲取第一個(gè)文檔數(shù)據(jù)
$last:? 根據(jù)資源文檔的排序獲取最后一個(gè)文檔數(shù)據(jù)
16.?unwind
將文檔中的某一個(gè)數(shù)組類型字段拆分成多條择葡,每條包含數(shù)組中的一個(gè)值
語法1
對(duì)某字段值進(jìn)行拆分
db.集合名稱.aggregate([{$unwind:'$字段名稱'}])
構(gòu)造數(shù)據(jù)
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
查詢
db.t2.aggregate([{$unwind:'$size'}])
語法2
對(duì)某字段值進(jìn)行拆分
處理空數(shù)組、非數(shù)組剃氧、無字段敏储、null情況
屬性preserveNullAndEmptyArrays值為false表示丟棄屬性值為空的文檔
屬性preserveNullAndEmptyArrays值為true表示保留屬性值為空的文檔
db.inventory.aggregate([{
$unwind:{
path:'$字段名稱',
preserveNullAndEmptyArrays:#防止數(shù)據(jù)丟失
}
}])
構(gòu)造數(shù)據(jù)
db.t3.insert([
{ "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "b", "size" : [ ] },
{ "_id" : 3, "item" : "c", "size": "M" },
{ "_id" : 4, "item" : "d" },
{ "_id" : 5, "item" : "e", "size" : null }
])
使用語法1查詢
db.t3.aggregate([{$unwind:'$size'}])
查看查詢結(jié)果,發(fā)現(xiàn)對(duì)于空數(shù)組朋鞍、無字段已添、null的文檔,都被丟棄了
問:如何能不丟棄呢滥酥?
答:使用語法2查詢
db.t3.aggregate([{$unwind:{path:'$size',preserveNullAndEmptyArrays:true}}])
17.?MongoDB索引
在mysql中已經(jīng)學(xué)習(xí)了索引更舞,并知道索引對(duì)于查詢速度的提升
mongodb也支持索引,以提升查詢速度
步驟一:創(chuàng)建大量數(shù)據(jù)
在命令行中執(zhí)行如下代碼坎吻,向集合中插入10萬條文檔
注意:不要在圖形界面中執(zhí)行缆蝉,因?yàn)檐浖驘o法插入10萬條數(shù)據(jù)就會(huì)中斷執(zhí)行
for(i=0;i<100000;i++){
db.t1.insert({name:'test'+i,age:i})
}
步驟二:數(shù)據(jù)查找性能分析
查找姓名為'test10000'的文檔
db.t1.find({name:'test10000'})
使用explain()命令進(jìn)行查詢性能分析
db.t1.find({name:'test10000'}).explain('executionStats')
其中的executionStats下的executionTimeMillis表示整體查詢時(shí)間,單位是毫秒
性能分析結(jié)果如下圖瘦真,由于機(jī)器的配置原因這個(gè)時(shí)間也會(huì)不同
索引前
步驟三:建立索引
創(chuàng)建索引
1表示升序刊头,-1表示降序
db.集合.ensureIndex({屬性:1})
如
db.t1.ensureIndex({name:1})
步驟四:對(duì)索引屬性查詢
執(zhí)行上面的同樣的查詢,并進(jìn)行查詢性能分析
db.t1.find({name:'test10000'}).explain('executionStats')
性能分析結(jié)果如下圖
索引后:
索引的命令
建立唯一索引吗氏,實(shí)現(xiàn)唯一約束的功能
db.t1.ensureIndex({"name":1},{"unique":true})
聯(lián)合索引芽偏,對(duì)多個(gè)屬性建立一個(gè)索引雷逆,按照find()出現(xiàn)的順序
db.t1.ensureIndex({name:1,age:1})
查看文檔所有索引
db.t1.getIndexes()
刪除索引
db.t1.dropIndex('索引名稱')
18.?MongoDB 備份與恢復(fù)
備份
語法:
mongodump -h dbhost -d dbname -o dbdirectory
-h:服務(wù)器地址弦讽,也可以指定端口號(hào)
-d:需要備份的數(shù)據(jù)庫名稱
-o:備份的數(shù)據(jù)存放位置,此目錄中存放著備份出來的數(shù)據(jù)
例1
sudo mkdir test1bak
sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
恢復(fù)
語法:
mongorestore -h dbhost -d dbname --dir dbdirectory
-h:服務(wù)器地址
-d:需要恢復(fù)的數(shù)據(jù)庫實(shí)例
--dir:備份數(shù)據(jù)所在位置
例1
mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1