1 MongoDB
1.1 簡介
MongoDB
是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫糠聪。由 C++
語言編寫睡蟋。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
MongoDB
是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品枷颊,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富戳杀,最像關(guān)系數(shù)據(jù)庫的
特點(diǎn):內(nèi)部執(zhí)行引擎為JS解釋器
该面, 把文檔存儲(chǔ)成bson
結(jié)構(gòu), 在查詢時(shí)信卡, 轉(zhuǎn)換為JS對(duì)象隔缀, 并可以通過熟悉的js語法來操作
mongo和傳統(tǒng)型數(shù)據(jù)庫相比,最大的不同:
- 傳統(tǒng)型數(shù)據(jù)庫: 結(jié)構(gòu)化數(shù)據(jù), 定好了表結(jié)構(gòu)后,每一行的內(nèi)容,必是符合表結(jié)構(gòu)的,就是說列的個(gè)數(shù),類型都一樣.
- mongo文檔型數(shù)據(jù)庫: 表下的每篇文檔,都可以有自己獨(dú)特的結(jié)構(gòu)(json對(duì)象都可以有自己獨(dú)特的屬性和值)
1.1.1 MongoDB與SQL比較
SQL術(shù)語/概念 | MongoDB術(shù)語/概念 | 解釋/說明 |
---|---|---|
database | database | 數(shù)據(jù)庫 |
table | collection | 數(shù)據(jù)庫表/集合 |
row | document | 數(shù)據(jù)記錄行/文檔 |
column | field | 數(shù)據(jù)字段/域 |
index | index | 索引 |
table joins | 表連接,MongoDB不支持 | |
primary key | primary key | 主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵 |
1.1.2 MongoDB數(shù)據(jù)類型
1.1.2.1 ObjectId
ObjectId
對(duì)象 ID
。用于創(chuàng)建文檔的 ID
傍菇,類似唯一主鍵猾瘸,可以很快的去生成和排序,包含 12 bytes
丢习,含義是:
- 前 4 個(gè)字節(jié)表示創(chuàng)建
unix 時(shí)間戳
,格林尼治時(shí)間 UTC 時(shí)間牵触,比北京時(shí)間晚了 8 個(gè)小時(shí) - 接下來的 3 個(gè)字節(jié)是
機(jī)器標(biāo)識(shí)碼
- 緊接的兩個(gè)字節(jié)由進(jìn)程 id 組成 PID
- 最后三個(gè)字節(jié)是隨機(jī)數(shù)
MongoDB
中存儲(chǔ)的文檔必須有一個(gè) _id
鍵。這個(gè)鍵的值可以是任何類型的咐低,默認(rèn)是個(gè) ObjectId
對(duì)象
由于ObjectId
中保存了創(chuàng)建的時(shí)間戳
揽思,所以不需要為文檔保存時(shí)間戳字段,可以通過 getTimestamp
函數(shù)來獲取文檔的創(chuàng)建時(shí)間:
> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2017-11-25T07:21:10Z")
ObjectId 轉(zhuǎn)為字符串
> newObject.str
5a1919e63df83ce79df8b38f
1.1.2.2 時(shí)間戳
時(shí)間戳见擦,Timestamp
钉汗,BSON
有一個(gè)特殊的時(shí)間戳類型用于 MongoDB
內(nèi)部使用,與普通的日期 類型不相關(guān)鲤屡。 時(shí)間戳值是一個(gè) 64
位的值损痰。其中:
- 前32位是一個(gè)
time_t
值(與Unix新紀(jì)元相差的秒數(shù)) - 后32位是在某秒中操作的一個(gè)遞增的序數(shù)
在單個(gè) mongod
實(shí)例中,時(shí)間戳值通常是唯一的酒来。
在復(fù)制集中卢未,oplog
有一個(gè) ts
字段。這個(gè)字段中的值使用BSON
時(shí)間戳表示了操作時(shí)間堰汉。
BSON
時(shí)間戳類型主要用于 MongoDB
內(nèi)部使用辽社。在大多數(shù)情況下的應(yīng)用開發(fā)中,可以使用 BSON
日期類型
1.1.3 幫助文檔
對(duì)于mongodb
中有些函數(shù)命令不知道的話衡奥,可以用help()
函數(shù)查看文檔幫助信息
- db.help(); 查看當(dāng)前數(shù)據(jù)庫幫助文檔
- db.col.help(); 查詢集合方面幫助文檔
1.2 用戶管理
1.2.1 簡介
在mongodb
中一般是沒有用戶名/密碼爹袁,除非另外配置才可以远荠,mongodb
用戶管理的特點(diǎn):
- 在
mongodb
中,有一個(gè)admin
數(shù)據(jù)庫, 牽涉到服務(wù)器配置層面的操作,需要先切換到admin
數(shù)據(jù).即 use admin , -->相當(dāng)于進(jìn)入超級(jí)用戶管理模式. -
mongo
的用戶是以數(shù)據(jù)庫為單位來建立的, 每個(gè)數(shù)據(jù)庫有自己的管理員. - 在設(shè)置用戶時(shí),需要先在
admin
數(shù)據(jù)庫下建立管理員矮固,這個(gè)管理員登陸后,相當(dāng)于超級(jí)管理員.
1.2.2 操作用戶
添加用戶
命令:
db.createUser(
{user: "root", pwd: "123456", roles: [{role: "root", db:"admin"}}
)
注意
:添加用戶后,我們?cè)俅瓮顺霾⒌顷?發(fā)現(xiàn)依然可以直接讀數(shù)據(jù)庫?
原因: mongodb
服務(wù)器啟動(dòng)時(shí)譬淳,默認(rèn)不是需要認(rèn)證的档址,要讓用戶生效, 需要啟動(dòng)服務(wù)器時(shí),就指定 --auth
選項(xiàng).這樣, 操作時(shí),就需要認(rèn)證了.
給某個(gè)數(shù)據(jù)庫添加用戶
use test // 跳轉(zhuǎn)到需要添加用戶的數(shù)據(jù)庫
db.createUser({
user: 'testAdmin', // 用戶名
pwd: '123456', // 密碼
roles:[{
role: 'readWrite', // 角色
db: 'test' // 數(shù)據(jù)庫名
}]
})
查看用戶
show users
認(rèn)證用戶
> use test
> db.auth(用戶名,密碼);
刪除用戶
> use test
> db.dropUser(用戶名);
1.3 數(shù)據(jù)庫
1.3.1 定義
一個(gè)mongodb
中可以建立多個(gè)數(shù)據(jù)庫。
MongoDB
的默認(rèn)數(shù)據(jù)庫為db
邻梆,該數(shù)據(jù)庫存儲(chǔ)在data
目錄中守伸。
MongoDB
的單個(gè)實(shí)例可以容納多個(gè)獨(dú)立的數(shù)據(jù)庫,每一個(gè)都有自己的集合和權(quán)限浦妄,不同的數(shù)據(jù)庫也放置在不同的文件中尼摹。
數(shù)據(jù)庫也通過名字來標(biāo)識(shí)见芹。數(shù)據(jù)庫名可以是滿足以下條件的任意UTF-8
字符串:
- 不能是空字符串
""
- 不得含有
' '
(空格)、.
蠢涝、$
玄呛、/
、\
和\0
(空字符)和二。 - 應(yīng)全部小寫
- 最多64字節(jié)
MongoDB
中有特殊作用的數(shù)據(jù)庫:
-
admin
: 從權(quán)限的角度來看徘铝,這是root
數(shù)據(jù)庫。要是將一個(gè)用戶添加到這個(gè)數(shù)據(jù)庫惯吕,這個(gè)用戶自動(dòng)繼承所有數(shù)據(jù)庫的權(quán)限惕它。一些特定的服務(wù)器端命令也只能從這個(gè)數(shù)據(jù)庫運(yùn)行,比如列出所有的數(shù)據(jù)庫或者關(guān)閉服務(wù)器废登。 -
local
: 這個(gè)數(shù)據(jù)永遠(yuǎn)不會(huì)被復(fù)制淹魄,可以用來存儲(chǔ)限于本地單臺(tái)服務(wù)器的任意集合 -
config
: 當(dāng)Mongo
用于分片設(shè)置時(shí),config
數(shù)據(jù)庫在內(nèi)部使用钳宪,用于保存分片的相關(guān)信息
1.3.2 查看數(shù)據(jù)庫:db
show dbs
命令可以顯示所有數(shù)據(jù)的列表揭北。
$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> show dbs
local 0.078GB
test 0.078GB
注意
:如果是剛創(chuàng)建的數(shù)據(jù)庫一般是不在數(shù)據(jù)庫的列表中, 要顯示它吏颖,我們需要向剛創(chuàng)建的數(shù)據(jù)庫數(shù)據(jù)庫插入一些數(shù)據(jù)就可以顯示
執(zhí)行db
命令可以顯示當(dāng)前數(shù)據(jù)庫對(duì)象或集合搔体。
$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> db
test
>
1.3.3 切換數(shù)據(jù)庫:use
運(yùn)行use
命令,可以連接到一個(gè)指定的數(shù)據(jù)庫半醉。
如果數(shù)據(jù)庫不存在疚俱,則創(chuàng)建數(shù)據(jù)庫
,否則切換
到指定數(shù)據(jù)庫
> use local
switched to db local
> db
local
>
以上實(shí)例命令中缩多,local
是要鏈接的數(shù)據(jù)庫
1.3.4 刪除數(shù)據(jù)庫:dropDatabase
刪除數(shù)據(jù)庫的語法格式如下:db.dropDatabase()
刪除當(dāng)前數(shù)據(jù)庫呆奕,默認(rèn)為 test
,可以使用 db
命令查看當(dāng)前數(shù)據(jù)庫名
1.4 集合
1.4.1 定義
集合
就是 MongoDB
文檔組衬吆,類似于關(guān)系數(shù)據(jù)庫中的表格
集合存在于數(shù)據(jù)庫中梁钾,集合沒有固定的結(jié)構(gòu),這意味著在對(duì)集合可以插入不同格式和類型
的數(shù)據(jù)逊抡,但通常情況下我們插入集合的數(shù)據(jù)都會(huì)有一定的關(guān)聯(lián)性
比如姆泻,我們可以將以下不同數(shù)據(jù)結(jié)構(gòu)的文檔插入到集合中:
{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.test.com","name":"test","num":5}
當(dāng)?shù)谝粋€(gè)文檔插入時(shí),集合就會(huì)被創(chuàng)建冒嫡。
合法的集合名規(guī)范:
- 集合名不能是空字符串
""
- 集合名不能含有
\0
字符(空字符)拇勃,這個(gè)字符表示集合名的結(jié)尾。 - 集合名不能以
system.
開頭孝凌,這是為系統(tǒng)集合保留的前綴方咆。 - 用戶創(chuàng)建的集合名字不能含有保留字符。有些驅(qū)動(dòng)程序的確支持在集合名里面包含蟀架,這是因?yàn)槟承┫到y(tǒng)生成的集合中包含該字符瓣赂。除非要訪問這種系統(tǒng)創(chuàng)建的集合榆骚,否則千萬不要在名字里出現(xiàn)
$
1.4.2 查看集合:show
如果要查看已有集合,可以使用 show collections
或 show tables
命令:
> show collections
myColl
system.indexes
1.4.3 創(chuàng)建集合:createCollection
MongoDB
中使用 createCollection()
方法來創(chuàng)建集合煌集。
db.createCollection(name, options)
參數(shù)說明:
-
name
: 要?jiǎng)?chuàng)建的集合名稱 -
options
: 可選參數(shù), 指定有關(guān)內(nèi)存大小及索引的選項(xiàng)
options
可以是如下參數(shù):
字段 | 類型 | 描述 |
---|---|---|
capped | 布爾 | (可選)如果為 true寨躁,則創(chuàng)建固定集合。固定集合是指有著固定大小的集合牙勘,當(dāng)達(dá)到最大值時(shí)职恳,它會(huì)自動(dòng)覆蓋最早的文檔。當(dāng)該值為 true 時(shí)方面,必須指定 size 參數(shù)放钦。 |
size | 數(shù)值 | (可選)為固定集合指定一個(gè)最大值,即字節(jié)數(shù)恭金。如果 capped 為 true操禀,也需要指定該字段。 |
max | 數(shù)值 | (可選)指定固定集合中包含文檔的最大數(shù)量横腿。 |
注意
:在插入文檔時(shí)颓屑,MongoDB
首先檢查固定集合的 size
字段,然后檢查 max
字段耿焊。
> use test
switched to db test
> db.createCollection("myColl")
{ "ok" : 1 }
>
下面是帶有幾個(gè)關(guān)鍵參數(shù)的 createCollection()
的用法:
創(chuàng)建固定集合 test揪惦,整個(gè)集合空間大小 6142800 B, 文檔最大個(gè)數(shù)為 10000 個(gè)。
> db.createCollection("test", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )
{ "ok" : 1 }
>
在 MongoDB
中罗侯,不需要?jiǎng)?chuàng)建集合器腋。當(dāng)插入一些文檔時(shí),MongoDB
會(huì)自動(dòng)創(chuàng)建集合钩杰。下面的test2
是在創(chuàng)建文檔時(shí)自動(dòng)創(chuàng)建的集合
> db.test2.insert({"name" : "測試mongodb"})
> show collections
test2
1.4.4 刪除集合:drop
MongoDB
中使用 drop()
方法來刪除集合
語法格式:
db.collection.drop()
如果成功刪除選定集合纫塌,則 drop()
方法返回true
,否則返回 false
在數(shù)據(jù)庫 mydb 中讲弄,我們可以先通過 show collections
命令查看已存在的集合:
>use mydb
switched to db mydb
>show collections
mycol
mycol2
system.indexes
>
接著刪除集合 mycol2 :
>db.mycol2.drop()
true
>
通過 show collections 再次查看數(shù)據(jù)庫 mydb 中的集合:
>show collections
mycol
system.indexes
從結(jié)果中可以看出 mycol2 集合已被刪除措左。
1.4.5 固定集合大小:capped collections
Capped collections
就是固定大小的collection
避除,它有很高的性能以及隊(duì)列過期的特性(過期按照插入的順序). 有點(diǎn)和 "RRD" 概念類似怎披。
Capped collections
是高性能
自動(dòng)的維護(hù)對(duì)象的插入順序。它非常適合類似記錄日志的功能和標(biāo)準(zhǔn)的 collection
不同,必須要顯式的創(chuàng)建一個(gè)capped collection
,指定一個(gè)collection
的大小梦重,單位是字節(jié)炊甲。collection
的數(shù)據(jù)存儲(chǔ)空間值提前分配的。
Capped collections
可以按照文檔的插入順序保存到集合中衔沼,而且這些文檔在磁盤上存放位置也是按照插入順序來保存的蝌借,所以當(dāng)我們更新Capped collections
中文檔的時(shí)候昔瞧,更新后的文檔不可以超過之前文檔的大小,這樣話就可以確保所有文檔在磁盤上的位置一直保持不變菩佑。
由于 Capped collection
是按照文檔的插入順序而不是使用索引確定插入位置自晰,這樣的話可以提高增添數(shù)據(jù)的效率。MongoDB
的操作日志文件oplog.rs
就是利用 Capped Collection
來實(shí)現(xiàn)的稍坯。
要注意的是指定的存儲(chǔ)大小包含了數(shù)據(jù)庫的頭信息酬荞,創(chuàng)建語法如下:
db.createCollection("mycoll", {capped:true, size:100000})
1.4.5.1 創(chuàng)建固定集合
我們通過createCollection
來創(chuàng)建一個(gè)固定集合,且capped
選項(xiàng)設(shè)置為true:
db.createCollection("cappedLogCollection",{capped:true,size:10000})
還可以指定文檔個(gè)數(shù),加上max:1000屬性:
db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})
size 是整個(gè)集合空間大小瞧哟,單位為【字節(jié)】
max 是集合文檔個(gè)數(shù)上線混巧,單位是【個(gè)】
如果空間大小到達(dá)上限,則插入下一個(gè)文檔時(shí)勤揩,會(huì)覆蓋第一個(gè)文檔
咧党;如果文檔個(gè)數(shù)到達(dá)上限,同樣插入下一個(gè)文檔時(shí)陨亡,會(huì)覆蓋第一個(gè)文檔傍衡。兩個(gè)參數(shù)上限判斷取的是與
的邏輯。
判斷集合是否為固定集合:
db.cappedLogCollection.isCapped()
如果需要將已存在的集合轉(zhuǎn)換為固定集合可以使用以下命令:
db.runCommand({"convertToCapped":"posts",size:10000})
以上代碼將我們已存在的 posts 集合轉(zhuǎn)換為固定集合负蠕。
1.4.5.2 查詢固定集合
固定集合文檔按照插入順序儲(chǔ)存的,默認(rèn)情況下查詢就是按照插入順序返回的,也可以使用$natural
調(diào)整返回順序蛙埂。
db.cappedLogCollection.find().sort({$natural:-1})
1.4.5.3 固定集合的功能特點(diǎn)
可以插入及更新,但更新不能超出collection的大小,否則更新失敗,不允許刪除,但是可以調(diào)用drop()
刪除集合中的所有行,但是drop
后需要顯式地重建集合。
1.4.5.4 固定集合特點(diǎn)及用法
特點(diǎn):
- 對(duì)固定集合進(jìn)行插入速度極快
- 按照插入順序的查詢輸出速度極快
- 能夠在插入最新數(shù)據(jù)時(shí),淘汰最早的數(shù)據(jù)
用法
- 儲(chǔ)存日志信息
- 緩存一些少量的文檔
1.4.6 特殊集合:元數(shù)據(jù)
數(shù)據(jù)庫的信息是存儲(chǔ)在集合中遮糖。它們使用了系統(tǒng)的命名空間:db.system.*
在MongoDB
數(shù)據(jù)庫中名字空間 <dbname>.system.*
是包含多種系統(tǒng)信息的特殊集合(Collection)箱残,如下:
集合命名空間 | 描述 |
---|---|
db.system.namespaces | 列出所有名字空間 |
db.system.indexes | 列出所有索引 |
db.system.profile | 包含數(shù)據(jù)庫概要(profile)信息 |
db.system.users | 列出所有可訪問數(shù)據(jù)庫的用戶 |
db.local.sources | 包含復(fù)制對(duì)端(slave)的服務(wù)器信息和狀態(tài) |
對(duì)于修改系統(tǒng)集合中的對(duì)象有如下限制:
-
{{system.indexes}}
插入數(shù)據(jù),可以創(chuàng)建索引止吁。但除此之外該表信息是不可變的(特殊的drop index
命令將自動(dòng)更新相關(guān)信息)被辑。 -
{{system.users}}
是可修改的 -
{{system.profile}}
是可刪除的