NoSQL( MongoDB )
MongoDB
概念
MongoDB是一款NoSQL類型的文檔型數(shù)據(jù)庫 就是一個(gè)數(shù)據(jù)庫,將數(shù)據(jù)存儲(chǔ)在磁盤文件中
NoSQL
NoSQL 是非關(guān)系型數(shù)據(jù)庫的廣泛定義
非關(guān)系型數(shù)據(jù)庫: 通常以鍵值對(duì)形式存儲(chǔ),沒有字段的限制, 如:memcache,redis,mongodb都是
NoSQL優(yōu)點(diǎn)
快速的讀寫
NoSQL缺點(diǎn)
沒有標(biāo)準(zhǔn)
MongoDB的安裝與配置
下載
http://www.mongodb.org/downloads 注: 32位的系統(tǒng)數(shù)據(jù)不能超過2G
創(chuàng)建MongoDB服務(wù)
前提: 現(xiàn)在安裝目錄下創(chuàng)建data目錄,用于后期存放數(shù)據(jù)
創(chuàng)建服務(wù): bin/mongod.exe --install --dbpath 磁盤路徑 --logpath 日志路徑
刪除服務(wù): bin/mongod.exe --remove
啟動(dòng)服務(wù): net start mongodb
關(guān)閉服務(wù): net stop mongodb
連接MongoDB服務(wù)器
語法: mongo.exe 服務(wù)器ip地址:端口/數(shù)據(jù)庫 (默認(rèn)test數(shù)據(jù)庫,默認(rèn)端口27017)
或通過mongo.exe 使用默認(rèn)進(jìn)入
Mongodb基本概念
mongodb和mysql的區(qū)別
mysql 數(shù)據(jù)庫 有: 數(shù)據(jù)庫 表 記錄
mongodb數(shù)據(jù)庫 數(shù)據(jù)庫 集合 文檔
mongodb中的集合相當(dāng)于mysql表,但是集合沒有列的限制,體現(xiàn)了模式自由.
mongodb內(nèi)部執(zhí)行引擎為JS解釋器,把文檔存儲(chǔ)成bson結(jié)構(gòu),在查詢時(shí),轉(zhuǎn)換為JS對(duì)象,并可以通過熟悉的JS語法來操作
庫和集合操作
查看已有數(shù)據(jù)庫
語法 : show databases 或 show dbs (* 為官方推薦語法)
選擇數(shù)據(jù)庫
use 數(shù)據(jù)庫名; (如數(shù)據(jù)庫不存在不會(huì)保存,當(dāng)改數(shù)據(jù)庫后期有數(shù)據(jù)時(shí)會(huì)自動(dòng)創(chuàng)建 -- 隱式創(chuàng)建)
刪除數(shù)據(jù)庫
db.dropDatabase();
注: 刪除數(shù)據(jù)庫時(shí),先use選擇要?jiǎng)h除的數(shù)據(jù)庫后,在執(zhí)行刪除命令
查看已有的集合/表
語法 : show tables 或 show collections (*)
創(chuàng)建集合(表)
語法: db.createCollection(集合名)
注: 當(dāng)在不存在的數(shù)據(jù)庫中創(chuàng)建集合時(shí),數(shù)據(jù)庫自動(dòng)創(chuàng)建
刪除集合(表)
語法: db.集合名.drop()
增刪改查(CURD)
C (Create) 增
語法: db.集合名.insert(json數(shù)據(jù))
集合存在則插入,集合不存在自動(dòng)創(chuàng)建
db.test.insert({name:"nanoha",age:18}); #插入一條name為nanoha age為18的數(shù)據(jù)
注: 在mongodb中有一個(gè)全球唯一的表示 _id
插入數(shù)據(jù)時(shí)可以自定義_id的值
db.test.insert({_id:"數(shù)字",name:"nanoha",age:18});
插入多條數(shù)據(jù)
通過數(shù)組方式可以一次插入多條數(shù)據(jù)
語法:db.集合名.insert([
json數(shù)據(jù),
....,
json數(shù)據(jù)
]);
代碼:
db.test.insert([
{name:"zs",age:18},
{name:"zs",age:18},
{name:"zs",age:18}
]);
結(jié)合js循環(huán)插入多條記錄
例如:
for (var i = 1; i <= 10; i++) {
db.test.insert({name:"zs"+i, age: i});
}
D (Delect) 刪
語法: db.集合名.remove(條件,[ 是否刪除一條數(shù)據(jù) 默認(rèn)為false ])
db.test.remove({name:xx}); #刪除name=xx的記錄
db.test.remove({name:xx},true); #刪除索引name=xx的記錄
db.test.remove({},true); #從上面刪除一條數(shù)據(jù)
db.test.remove({}); #刪除所有數(shù)據(jù)
U (Update) 改
語法: db.集合名.update(條件,新數(shù)據(jù),是否新增,是否修改多條)
是否新增: 指匹配不到數(shù)據(jù)則插入(true是插入 false是不插入-默認(rèn))
是否修改多條: 將匹配到的數(shù)據(jù)都修改(false否-默認(rèn))
db.c1.update({name:"zs1"}, {name:"zs2"}); # 這是替換并不是修改
修改數(shù)據(jù)
修改器 -
$inc : 增長(zhǎng) 可以對(duì)文檔的某個(gè)值為數(shù)字型(智能滿足要求的數(shù)字)的鍵進(jìn)行增減操作
$rename : 重命名列
$set : 修改某列的值(如果該字段不存在會(huì)增加)
$unset : 刪除指定的列
修改數(shù)據(jù)
db.c1.update({age:2}, {$set:{name:"zs22"}}); #將age=2的字段里的name修改為zs22
db.c1.update({name:"zs10"}, {$inc: {age: 2}}); #給name=zx10的 age加2
db.c1.update({name:"zs10"}, {$inc: {age: -2}}); .... age-2
修改器語法 : db.集合名.update(條件,{修改器:{鍵:值}})
數(shù)據(jù) db.test3.insert( {name:"豬八戒",age:888,who:"男",other:"非國人"});
db.test3.update({name:"豬八戒"}, {
$set: {name:"孫悟空"}, #name 改成 孫悟空
$inc: {age:111}, #age 增加 111
$rename: {who:"sex"}, #who 改字段 sex
$unset: {other:1} # other 刪除
});
db.test3.update({name:"zx30"},{age:30},true) # 找不到則插入
db.test3.update({},{name:"hha"},false,true) #不能替換全部數(shù)據(jù),可以修改全部數(shù)據(jù),切記記得加上修改器
R (Retrieve) 查
語法: db.集合名.find()
db.c1.find() #顯示c1中全部數(shù)據(jù)
db.c1.find({},{age:1}) 只顯示age字段
db.c1.find({},{age:0}) 只顯示除age字段以外的字段
支持運(yùn)算符查詢
db.c1.find(age:{$gt:5}) 查詢age大于5的數(shù)據(jù)
db.c1.find({age: {$in:[5,8,10]}}); 查詢age是5.8.10的數(shù)據(jù)
MongoDB的權(quán)限機(jī)制
權(quán)限機(jī)制概述
說明: 在mongodb中用戶屬于數(shù)據(jù)庫,也就是每個(gè)數(shù)據(jù)庫都有自己的用戶
開啟驗(yàn)證模式
開啟驗(yàn)證模式: 名詞 ,指用戶需要賬號(hào)密碼才能登陸
a. 在不需要賬號(hào)密碼登陸的情況下棚蓄,選擇admin數(shù)據(jù)庫創(chuàng)建超級(jí)管理員
b. 退出mongodb 停止服務(wù) 卸載服務(wù)
C. 安裝需要身份驗(yàn)證的服務(wù)(也就是說安裝時(shí)加上參數(shù)--auth)
添加超級(jí)管理員
use admin;
db.createUser({
"user" : "admin",
"pwd": "admin888",
"customData" : {employeeId:"提示密碼admin888"},
"roles" : [{
role: "root",
db: "admin"
}]
})
重新以驗(yàn)證模式啟動(dòng)mongod服務(wù)
net stop mongodb #停止服務(wù)
mongod --remove #卸載服務(wù)
mongod.exe --install --auth --dbpath 磁盤路徑 --logpath 日志路徑
net start mongodb #啟動(dòng)服務(wù)
通過超級(jí)管理員賬號(hào)登錄
mongo 服務(wù)器 IP 地址:端口/數(shù)據(jù)庫 -u 用戶名 -p 密碼
登錄之后輸入,先選擇admin數(shù)據(jù)庫在db.auth
db.auth('admin','admin888')
【shop1】
db.createUser({
"user" : "shop1",
"pwd": "admin888",
"customData" : {employeeId:"提示密碼admin888"},
"roles" : [{
role: "read", #讀權(quán)限
db: "shop"
}]
})
【shop2】
db.createUser({
"user" : "shop2",
"pwd": "admin888",
"customData" : {employeeId:"提示密碼admin888"},
"roles" : [{
role: "readWrite", #讀寫權(quán)限
db: "shop"
}]
})
MongoDB的索引
情景設(shè)置
向數(shù)據(jù)庫新增十萬條數(shù)據(jù)測(cè)試
//選擇數(shù)據(jù)庫
use test;
//向數(shù)據(jù)庫中添加數(shù)據(jù)
for(var i=0;i<100000;i++){
db.data1.insert({'name':"aaa"+i,"age":i});
}
索引的建立
語法
創(chuàng)建索引語法: db.集合名.createIndex(待創(chuàng)建索引的列,[額外選項(xiàng)])
待創(chuàng)建索引的列語法: {鍵1,鍵2} 說明 1-升序 -1 降序
額外選項(xiàng): 設(shè)置索引,聲明唯一索引等
刪除索引語法:
全部刪除: db.集合名.dropIndexes();
刪除指定: db.集合名.dropIndex(索引名)
查看索引語法: db.集合名.getIndexes();
創(chuàng)建普通索引
db.data1.createIndex({name:1}) #給name添加索引
db.data1.dropIndex('name_1') #刪除name索引
db.data1.createIndex({name:1}, {name:'xx'}) #創(chuàng)建name索引,改名為xx
創(chuàng)建復(fù)合/組合索引
需求: 給name和age添加組合索引
說明: 就是一次性給兩個(gè)字段建立索引
語法:db.集合名.createIndex({鍵1:方式,鍵2:方式})
db.data1.createIndex({name:1, age:1});
創(chuàng)建唯一索引
db.data1.dropIndexes(); #刪除所有索引
db.data1.createIndex({name:1}, {unique:"name"});增加唯一索引
數(shù)據(jù)庫的備份和還原
備份數(shù)據(jù)庫
?導(dǎo)出數(shù)據(jù)語法: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 備份到指定目錄下
備份所有數(shù)據(jù):
mongodump -u admin -p admin888 -o C:\itcast\mongodb\bak
備份指定數(shù)據(jù)
mongodump -u shop1 -p admin888 -d shop -o C:\itcast\mongodb\bak2
還原數(shù)據(jù)庫
?導(dǎo)出數(shù)據(jù)語法: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ù)
還原所有數(shù)據(jù)
mongorestore -u admin -p admin888 --drop C:\itcast\mongodb\bak
還原指定數(shù)據(jù)庫
mongorestore -u shop2 -p admin888 --drop C:\itcast\mongodb\bak2
PHP操作MongoDB
開啟mongo擴(kuò)展
通過phpinfo()查看php相關(guān)信息,便于選擇擴(kuò)展文件
根據(jù)相關(guān)信息選擇擴(kuò)展文件
下載地址:https://pecl.php.net/package/mongo/1.6.14/windows
將下載的dll文件到本地并放到php的ext目錄下,然后引入擴(kuò)展,并重啟服務(wù)
在php.ini中 開啟擴(kuò)展 添加
extension=php_mongo.dll
在通過phpinfo驗(yàn)證是否開啟成功
在PHP中操作數(shù)據(jù)
PHP添加數(shù)據(jù)
<?php
#步驟1:創(chuàng)建mongodb對(duì)象
//mongodb://賬號(hào):密碼@服務(wù)器
//$mongodb = @new Mongo("mongodb://admin:admin888@localhost");#不建議使用老版本語法 已被淘汰
$mongodb = @new MongoClient("mongodb://admin:admin888@localhost"); #建議使用
#步驟2:插入數(shù)據(jù),語法:$mongodb->數(shù)據(jù)庫名->集合名->insert(數(shù)組)
$rs = $mongodb->php13->c1->insert([
'name' => 'xiaoze',
'age' => 18
]);
var_dump($rs)
PHP修改數(shù)據(jù)
#修改數(shù)據(jù)
$mongodb = new MongoClient ("mongodb://admin:admin888@localhost");
#資源->數(shù)據(jù)庫->集合(文檔)->方法
$rs = $mongodb->php15->class->update(
['name'=>'123456'],
[
'$set'=>['name'=>'xiaoze'],
'$inc'=>['age' => 10]
]
);
var_dump($rs);
PHP輸出數(shù)據(jù)
$mongodb = new MongoClient ("mongodb://admin:admin888@localhost");
$rs = $mongodb->php15->class->find();
foreach($rs as $c1){
echo $c1['name']."__";
echo $c1['age']."<br>";
}
PHP刪除數(shù)據(jù)
$mongodb = new MongoClient ("mongodb://admin:admin888@localhost");
# 刪除數(shù)據(jù)
$rs = $mongodb ->php15->class->remove([
'name' => '123456',
]);
var_dump($rs);