MongoDB學(xué)習(xí)總結(jié)(一)

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ū)別

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ì)不同

索引前

性能分析結(jié)果

步驟三:建立索引

創(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膀哲,一起剝皮案震驚了整個(gè)濱河市往产,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌某宪,老刑警劉巖仿村,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兴喂,居然都是意外死亡蔼囊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門衣迷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畏鼓,“玉大人,你說我怎么就攤上這事壶谒≡平茫” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵汗菜,是天一觀的道長(zhǎng)让禀。 經(jīng)常有香客問我挑社,道長(zhǎng),這世上最難降的妖魔是什么巡揍? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任痛阻,我火速辦了婚禮,結(jié)果婚禮上腮敌,老公的妹妹穿的比我還像新娘录平。我一直安慰自己,他們只是感情好缀皱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布斗这。 她就那樣靜靜地躺著,像睡著了一般啤斗。 火紅的嫁衣襯著肌膚如雪表箭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天钮莲,我揣著相機(jī)與錄音免钻,去河邊找鬼。 笑死崔拥,一個(gè)胖子當(dāng)著我的面吹牛极舔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播链瓦,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼拆魏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了慈俯?” 一聲冷哼從身側(cè)響起唯灵,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤吮便,失蹤者是張志新(化名)和其女友劉穎运怖,沒想到半個(gè)月后抬虽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刑峡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年洋闽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片突梦。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诫舅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阳似,到底是詐尸還是另有隱情骚勘,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站俏讹,受9級(jí)特大地震影響当宴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泽疆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一户矢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殉疼,春花似錦梯浪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眠砾,卻和暖如春虏劲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褒颈。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工柒巫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谷丸。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓堡掏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刨疼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泉唁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容