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

二、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 databases 或 show 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 tables 或 show collections
⑤創(chuàng)建集合:db.createCollection(‘集合名’)
⑥刪除集合:db.集合名.drop()
2、數(shù)據(jù)增刪改查
① C 增
語法:db.集合名.insert(json數(shù)據(jù))
說明:集合存在-則插入,集合不存在-自動(dòng)創(chuàng)建
<1>插入多條數(shù)據(jù):


語法:
db.集合名.remove(條件 [,是否刪除一條])是否刪除一條:
true - 是,false - 否默認(rèn)
語法:
db.集合名.udpate(條件,新數(shù)據(jù),是否新增,是否修改多條)說明:
是否新增:指匹配不到數(shù)據(jù)則插入(
true-是插入,false-否不插入默認(rèn))是否修改多條:將匹配成功的數(shù)據(jù)都修改(
true-是,false-否默認(rèn))
修改器語法:
db.集合名.update(條件,{修改器:{鍵:值}})
<1>將name3的年齡改為300:


語法:
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)算符:值}})


四、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"
}]
})



--auth)

不輸入密碼直接登陸

登陸方式一:
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)建普通索引




<1>age未添加索引情況
db.data1.find({age:18}).explain('executionStats')
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)限
重點(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]
);
