MongoDB基礎(chǔ)之用戶管理至非,數(shù)據(jù)庫,集合

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 collectionsshow 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}}是可刪除的
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敬惦,隨后出現(xiàn)的幾起案子盼理,更是在濱河造成了極大的恐慌,老刑警劉巖俄删,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宏怔,死亡現(xiàn)場離奇詭異,居然都是意外死亡畴椰,警方通過查閱死者的電腦和手機(jī)臊诊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斜脂,“玉大人抓艳,你說我怎么就攤上這事≈愦粒” “怎么了玷或?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵儡首,是天一觀的道長。 經(jīng)常有香客問我偏友,道長蔬胯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任位他,我火速辦了婚禮氛濒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鹅髓。我一直安慰自己泼橘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布迈勋。 她就那樣靜靜地躺著炬灭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪靡菇。 梳的紋絲不亂的頭發(fā)上重归,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音厦凤,去河邊找鬼鼻吮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛较鼓,可吹牛的內(nèi)容都是我干的椎木。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼博烂,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼香椎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起禽篱,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤畜伐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后躺率,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玛界,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年悼吱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慎框。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡后添,死狀恐怖笨枯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤猎醇,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站努溃,受9級(jí)特大地震影響硫嘶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梧税,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一沦疾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧第队,春花似錦哮塞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尸执,卻和暖如春家凯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背如失。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工绊诲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人褪贵。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓掂之,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脆丁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子世舰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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