NoSQL( MongoDB )

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)算符查詢

運(yùn)算符.png
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ù)庫都有自己的用戶

用戶.png

開啟驗(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" 
    }] 
})
角色.png
重新以驗(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);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末君旦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萎河,老刑警劉巖片效,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異激况,居然都是意外死亡作彤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門乌逐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竭讳,“玉大人,你說我怎么就攤上這事浙踢【盥” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵洛波,是天一觀的道長(zhǎng)胰舆。 經(jīng)常有香客問我,道長(zhǎng)蹬挤,這世上最難降的妖魔是什么缚窿? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮闻伶,結(jié)果婚禮上滨攻,老公的妹妹穿的比我還像新娘。我一直安慰自己蓝翰,他們只是感情好光绕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著畜份,像睡著了一般诞帐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爆雹,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天停蕉,我揣著相機(jī)與錄音愕鼓,去河邊找鬼。 笑死慧起,一個(gè)胖子當(dāng)著我的面吹牛菇晃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚓挤,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼磺送,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了灿意?” 一聲冷哼從身側(cè)響起估灿,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缤剧,沒想到半個(gè)月后馅袁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荒辕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年汗销,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兄纺。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡大溜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出估脆,到底是詐尸還是另有隱情钦奋,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布疙赠,位于F島的核電站付材,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏圃阳。R本人自食惡果不足惜厌衔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捍岳。 院中可真熱鬧富寿,春花似錦、人聲如沸锣夹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽银萍。三九已至变勇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贴唇,已是汗流浹背搀绣。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工飞袋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人链患。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓巧鸭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親锣险。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹄皱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,905評(píng)論 2 89
  • 簡(jiǎn)介 NoSQL : 全名為Not Only SQL, 指的是非關(guān)系型的數(shù)據(jù)庫 隨著訪問量上升, 網(wǎng)站的數(shù)據(jù)庫性能...
    奮斗的老王閱讀 3,036評(píng)論 4 47
  • nosql 數(shù)據(jù)庫 是非關(guān)系型數(shù)據(jù)庫 (not only sql)(BSON == JSON == dict) 常...
    清茶也醉人Q閱讀 231評(píng)論 0 0
  • mogon簡(jiǎn)介 MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫。由 C++ 語言編寫芯肤。旨在為 WEB 應(yīng)用提供可...
    豬哥亮閱讀 1,998評(píng)論 0 10
  • 每到秋冬換季崖咨,就琢磨著把衣櫥里的衣服都整理一下,順便把夏天的衣服裝到箱子里油吭,把冬天的衣服從箱子里取出來掛...
    半束微光閱讀 186評(píng)論 1 2