MongoDB

一、概述

MongoDB是一款NoSQL類型的文檔型數(shù)據(jù)庫,就是一個(gè)數(shù)據(jù)庫,將數(shù)據(jù)存儲(chǔ)在磁盤文件中。
MongoDB數(shù)據(jù)庫中有:數(shù)據(jù)庫(database)、集合(collection)、文檔(document)

對(duì)比MySQL如下:

二、MongoDB存儲(chǔ)方式

MongoDB是文檔型數(shù)據(jù)庫,文件以BSON格式存儲(chǔ)在硬盤中。
BSON是JSON的一種二進(jìn)制形式的存儲(chǔ)格式。
注:MongoDB內(nèi)部執(zhí)行引擎為JS解釋器, 把文檔存儲(chǔ)成bson結(jié)構(gòu),在查詢時(shí),轉(zhuǎn)換為JS對(duì)象,并可以通過熟悉的JS語法來操作。

三、入門命令

1、庫和集合操作

①查看已有的數(shù)據(jù)庫:show databasesshow dbs
②選擇數(shù)據(jù)庫:use 數(shù)據(jù)庫名
隱式創(chuàng)建:在use一個(gè)不存在的數(shù)據(jù)庫時(shí),不會(huì)報(bào)錯(cuò),當(dāng)該數(shù)據(jù)庫下后期有數(shù)據(jù)寫入則會(huì)自動(dòng)創(chuàng)建
③刪除數(shù)據(jù)庫:先use選擇數(shù)據(jù)庫再執(zhí)行命令db.dropDatabase()
④查看已有的集合:show tablesshow collections
⑤創(chuàng)建集合:db.createCollection(‘集合名’)
⑥刪除集合:db.集合名.drop()

2、數(shù)據(jù)增刪改查

① C 增
語法:db.集合名.insert(json數(shù)據(jù))
說明:集合存在-則插入,集合不存在-自動(dòng)創(chuàng)建
<1>插入多條數(shù)據(jù):

<2>循環(huán)插入多條數(shù)據(jù):
② D 刪
語法:db.集合名.remove(條件 [,是否刪除一條])
是否刪除一條:true - 是,false - 否默認(rèn)
③ U 改
語法:db.集合名.udpate(條件,新數(shù)據(jù),是否新增,是否修改多條)
說明:
是否新增:指匹配不到數(shù)據(jù)則插入(true-是插入,false-否不插入默認(rèn))
是否修改多條:將匹配成功的數(shù)據(jù)都修改(true-是,false-否默認(rèn))
注意:上述代碼不是修改,而是替換新數(shù)據(jù),如果只修改單列則可以通過修改器來實(shí)現(xiàn)
修改器語法db.集合名.update(條件,{修改器:{鍵:值}})
示例:
<1>將name3的年齡改為300:
<2>將name4的姓名改為wangwu,年齡加11:
④ R 查
語法:db.集合名.find(條件 [,查詢列])
查詢條件說明:

 {}                 查詢所有數(shù)據(jù)
 {age:1}            查詢age=1的數(shù)據(jù)
 {age:1,sex:1}      查詢age=1并且sex=1的數(shù)據(jù)

查詢的列說明:

注:可選參數(shù),不寫則查詢?nèi)孔侄?{age:1}     只顯示age字段
{age:0}     顯示age以外的字段

運(yùn)算符使用語法db.集合名.find({鍵:{運(yùn)算符:值}})

示例:查詢年齡是5歲、6歲、7歲的數(shù)據(jù)

四、MongoDB的權(quán)限機(jī)制

1、權(quán)限機(jī)制概述

說明:在mongodb中用戶屬于數(shù)據(jù)庫,也就是每個(gè)數(shù)據(jù)庫都有自己的用戶
注意:在MongoDB中有一個(gè)admin數(shù)據(jù)庫,該數(shù)據(jù)庫的用戶是超級(jí)管理員,超級(jí)管理員可以管理其它數(shù)據(jù)庫。
提示:
3.x.x版本默認(rèn)看不到admin數(shù)據(jù)庫,但是可以選擇并查看對(duì)應(yīng)的表
2.x.x版本通過show dbs可以直接查看admin數(shù)據(jù)庫

2、開啟驗(yàn)證模式

步驟:
①在不需要賬號(hào)密碼登陸的情況下,選擇admin數(shù)據(jù)庫創(chuàng)建超級(jí)管理員

use  admin
db.createUser({ 
"user" : "admin",
"pwd": "666666",
"customData" : {employeeId:"提示密碼666"},
"roles" : [{ 
role: "root", 
db: "admin" 
}] 
})

②退出mongodb、停止服務(wù)、卸載服務(wù)
③安裝需要身份驗(yàn)證的服務(wù)(也就是說安裝時(shí)加上參數(shù)--auth
④測試
不輸入密碼直接登陸
通過超級(jí)管理員賬號(hào)登陸
登陸方式一:mongo 服務(wù)器IP地址:端口/數(shù)據(jù)庫 -u 用戶名 -p 密碼
登錄方式二:登錄之后輸入,先use amdin選擇數(shù)據(jù)庫再db.auth(用戶名,密碼)

3、特別說明:添加用戶的語法
use  admin  #必須要先選擇數(shù)據(jù)庫再創(chuàng)建該數(shù)據(jù)庫的用戶
db.createUser({ 
"user" : "admin",   #用戶名
"pwd": "666666",    #密碼
"customData" : {employeeId:"提示密碼666666"},   #描述
"roles" : [{ 
role: "root",   #角色
db: "admin"     #所屬數(shù)據(jù)庫
}] 
})

角色信息:

角色作用:

五、MongoDB的索引

1、創(chuàng)建索引

①創(chuàng)建索引:db.集合名.createIndex(待創(chuàng)建索引的列 [,額外選項(xiàng)])
參數(shù):
待創(chuàng)建索引的列:{鍵:1,鍵:-1} 說明(1-升序,-1表示降序) 如:{age:1}表示創(chuàng)建age索引,并按升序的方式存儲(chǔ)
額外選項(xiàng):設(shè)置索引、聲明唯一索引等
②創(chuàng)建復(fù)合/組合索引
語法:db.集合名.createIndex({鍵1:方式,鍵2:方式})
說明:就是一次性給兩個(gè)字段建立索引
③創(chuàng)建唯一索引
語法:db.集合名.createIndex(待添加索引的列,{unique: 列名})
注意:唯一索引不能插入重復(fù)數(shù)據(jù)

2、刪除索引

全部刪除:db.集合名.dropIndexes()【注意:由系統(tǒng)創(chuàng)建的_id索引無法刪除】
刪除指定:db.集合名.dropIndex(索引名)

3、查看索引

語法:db.集合名.getIndexes()

4、分析索引.explain('executionStats')

語法:db.集合名.find().explain('executionStats')
索引的掃描方式:

COLLSCAN    全表掃描
IXSCAN      索引掃描
FETCH       根據(jù)索引去檢索指定document

詳細(xì)說明如圖:
5、示例

①創(chuàng)建普通索引

②創(chuàng)建索引并起名sy_name
③給name和age添加組合索引
④設(shè)置唯一索引
⑤分析索引
<1>age未添加索引情況
db.data1.find({age:18}).explain('executionStats')
<2>age添加索引情況
db.data1.createIndex({age:1})
db.data1.find({age:18}).explain('executionStats')

六、數(shù)據(jù)庫的備份和還原

1、備份數(shù)據(jù)庫(mongodump

語法:mongodump -h -port -u -p -d -o
說明

-h       host 服務(wù)器ip地址(注:可不寫則默認(rèn)本機(jī))
-port    端口(注:可不寫則默認(rèn)27017)
-u       user 用戶名(注:開啟驗(yàn)證模式才必寫)
-p       passwd 密 碼(注:開啟驗(yàn)證模式才必寫)
-d       database 數(shù)據(jù)庫(注:不寫則備份全部數(shù)據(jù)庫)
-o       open 備份到指定目錄下
2、還原數(shù)據(jù)庫(mongorestore

語法:mongorestore -h -port -u -p -d --drop 備份數(shù)據(jù)目錄
說明

-h       host 服務(wù)器ip地址(注:可不寫則默認(rèn)本機(jī))
-port    端口(注:可不寫則默認(rèn)27017)
-u       user 用戶名(注:開啟驗(yàn)證模式才必寫)
-p       passwd 密碼(注:開啟驗(yàn)證模式才必寫)
-d       database 數(shù)據(jù)庫(注:不寫則還原全部數(shù)據(jù)庫)
--drop   先刪除數(shù)據(jù)再恢復(fù)
3、特別說明,備份、還原權(quán)限問題

角色說明:
admin(超級(jí)管理員)
shop1(shop數(shù)據(jù)庫下具有r權(quán)限的用戶)
shop2(shop數(shù)據(jù)庫下具有rw權(quán)限的用戶)
①admin可以備份所有的數(shù)據(jù)庫,但是備份指定數(shù)據(jù)庫必須用數(shù)據(jù)庫自己的用戶
mongodump -u admin -p 666666 -o D:\MongoDB\bak :admin備份全部數(shù)據(jù)庫

mongodump -u admin -p 666666 -o D:\MongoDB\bak:報(bào)錯(cuò)-admin無法備份shop數(shù)據(jù)庫,沒有權(quán)限
②shop1(r權(quán)限)可以備份shop數(shù)據(jù)庫,但是不可以還原;shop2(rw權(quán)限)可以備份、還原shop數(shù)據(jù)庫。
重點(diǎn)注意:如果備份、還原指定的數(shù)據(jù)庫A,那么只有數(shù)據(jù)庫A的用戶才有權(quán)限操作。

七、PHP5.6操作MongoDB

#創(chuàng)建mongodb對(duì)象
//格式:new Mongo(mongodb://賬號(hào):密碼@服務(wù)器)
$mongodb = @new Mongo("mongodb://admin:666666@localhost");

#查詢數(shù)據(jù)(注意:$cls)
$users = $mongodb->test->user->find();
//遍歷數(shù)據(jù)
foreach ($users as $user) {
    echo '<pre>';
    print_r($user); 
}

#插入數(shù)據(jù):$mongodb->數(shù)據(jù)庫名->集合名->insert(數(shù)組)
$rs = $mongodb->test->user->insert([
    'name' => 'zhangsan',
    'age' => 18
]);

#修改數(shù)據(jù):db.c1.update({}, {$set:{name:"xiaocnag"}})
$rs = $mongodb->test->user->update(
    [], 
    [
        '$set' => ['name' => 'lisi'],
        '$inc' => ['age' => 10]
    ],
    //設(shè)置修改多條數(shù)據(jù)
    ['multiple' => true]
);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容