1.MongoDB簡(jiǎn)介
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供貴陽(yáng)網(wǎng)站建設(shè)、貴陽(yáng)做網(wǎng)站、貴陽(yáng)網(wǎng)站設(shè)計(jì)、貴陽(yáng)網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、貴陽(yáng)企業(yè)網(wǎng)站模板建站服務(wù),10多年貴陽(yáng)做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
mongodb是一個(gè)基于分布式存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)又被稱為文檔數(shù)據(jù)庫(kù),可以將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)有鍵值對(duì)(key=>value)對(duì)組成,存儲(chǔ)的文檔類似于JSON對(duì)象(BSON->JSON的二進(jìn)制化)。
特點(diǎn):內(nèi)部執(zhí)行引擎為JS解釋器,把文檔存儲(chǔ)成BSON結(jié)構(gòu),在查詢時(shí),轉(zhuǎn)換為JS對(duì)象,并可以通過(guò)熟悉的JS語(yǔ)法來(lái)操作。
mongodb和傳統(tǒng)數(shù)據(jù)庫(kù)簡(jiǎn)單比較,最大的不同:
傳統(tǒng)型數(shù)據(jù)庫(kù):結(jié)構(gòu)化數(shù)據(jù),定好了表結(jié)構(gòu)后,每一行的內(nèi)容,必定是符合表結(jié)構(gòu)的,就是說(shuō)列的個(gè)數(shù)以及類型都一樣。
文檔數(shù)據(jù)庫(kù):表下的每篇文檔都可以有自己獨(dú)特的結(jié)構(gòu)或者屬性和值。
2.MongoDb的安裝(centos7下詳細(xì)安裝步驟)
1)首先下載mongodb安裝包:
#wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.4.tgz
2)進(jìn)入到下載的目錄,將mongodb的安裝包解壓到指定的目錄中:
#tar -xvf mongodb-linux-x86_64-rhel70-3.4.4.tgz -C /usr/local
3)進(jìn)入解壓到的目錄,來(lái)啟動(dòng)mongodb服務(wù)
#cd /usr/local
重命名MongoDb解壓的目錄
#mv mongodb-linux-x86_64-rhel70-3.4.4 mongodb #cd mongodb
4)啟動(dòng)MongoDb
#mkdir -p /home/mongodata/ /var/log/mongolog/ #./bin/mongod --dbpath /home/mongodata/ --logpath /var/log/mongolog/mongo.log --fork --port 27017
啟動(dòng)參數(shù)說(shuō)明:
--dbpath 數(shù)據(jù)存儲(chǔ)目錄
--logpath 日志存儲(chǔ)目錄
--port 運(yùn)行端口
--fork 后臺(tái)運(yùn)行
5)通過(guò)客戶端連接到MongoDb
#./bin/mongo
注意:在一些老的版本中MongoDb啟動(dòng)的時(shí)候會(huì)事先占用很多磁盤空間,啟動(dòng)后可能需要占3-4G空間,如果虛擬機(jī)的空間過(guò)小將不能啟動(dòng),但是它有一個(gè)選項(xiàng)--smallfiles可以使啟動(dòng)時(shí)占用空間縮小至400M左右。
3.mongodb具體操作示例
一 、mongodb的入門操作:
1)查詢所有庫(kù)列表
>show dbs;
2)切換數(shù)據(jù)庫(kù)(選擇使用的數(shù)據(jù)庫(kù))
>use local;
3)創(chuàng)建數(shù)據(jù)庫(kù)
(注意:由于mongodb數(shù)據(jù)庫(kù)是隱式創(chuàng)建沒(méi)有直接的創(chuàng)建數(shù)據(jù)庫(kù)的方法,但可以直接使用use切換到一個(gè)事先不存在的庫(kù)下邊,當(dāng)創(chuàng)建表(collections)的時(shí)候會(huì)自動(dòng)創(chuàng)建當(dāng)前數(shù)據(jù)庫(kù))
>use shop
(假設(shè)shop庫(kù)不存在,也可以直接使用use)
>db.createCollection('user');
(可以在一個(gè)不存在的庫(kù)下邊直接創(chuàng)建collections(或者可以說(shuō)創(chuàng)建表))
>show dbs;
然后你再去查看庫(kù)的時(shí)候會(huì)發(fā)現(xiàn)庫(kù)shop已經(jīng)默認(rèn)創(chuàng)建出來(lái)了。
4)創(chuàng)建一個(gè)表(collections)
>db.createCollection('user')
注意:表(也就是collections)也可以是隱式創(chuàng)建的,還拿上邊的例子說(shuō):假如shop庫(kù)里邊不存在一個(gè)goods的表(collections),我們?nèi)匀豢梢允褂孟逻叺姆绞讲迦霐?shù)據(jù)
>db.goods.insert({_id:1,name:'pipixia',price:52.10});
然后我們?nèi)ゲ榭磗hop這個(gè)庫(kù)內(nèi)的表(collections)時(shí),發(fā)現(xiàn)goods已經(jīng)被自動(dòng)創(chuàng)建出來(lái)了。
5)向collections(表)中插入單篇文檔(數(shù)據(jù))(插入的數(shù)據(jù)為json格式)
>db.user.insert({name:'張三',age:18})
6)查找collections(表)中的內(nèi)容
>db.user.find()
7)刪除collections(表)()
>db.user.drop()
8)刪除數(shù)據(jù)庫(kù)(databases)
>db.dropDatabase()
二、mongodb的基本操作(增、刪、改、查)CURD
1.增操作:insert
注意:mongodb存儲(chǔ)的是文檔,而所謂的文檔在這里其實(shí)是json格式的對(duì)象
1)增加單篇文檔
>db.collectionName.insert({sn:'001',name:'xiaoming'})
2)增加單篇文檔,并指定id
>db.collectionName.insert({_id:2,sn:'002',name:'xiaohong'})
3)增加多篇文檔(因?yàn)閖son是一個(gè)對(duì)象,js里邊有數(shù)組的概念,只需把多個(gè)對(duì)象放到數(shù)組里即可)
>db.collectionName.insert([{sn:'003','name':'zhangfei'},{sn:'004','name':'guanyu'},{sn:'004','name':'liubei'}])
2.刪操作:remove
語(yǔ)法:db.collectionName.remove(查詢表達(dá)式,選項(xiàng))
選項(xiàng)是指{justOne:true/false},是否刪一行,默認(rèn)是false
注意:
1.查詢表達(dá)式依然是一個(gè)json對(duì)象
2.查詢表達(dá)式匹配到的行將被刪除
3.如果沒(méi)有查詢表達(dá)式,則collections中的所有文檔將全部被刪除
1)刪除指定json文檔(json格式的對(duì)象)
例如:刪除collectionName表中sn屬性值為002的json對(duì)象文檔
>db.collectionName.remove({sn:'002'})
2)假如查詢表達(dá)式為空,如下
>db.collectionName.remove()
會(huì)刪除庫(kù)中的所有文檔,使用要小心
3)假如我們想刪除符合查詢表達(dá)式中的一行數(shù)據(jù)可以使用上邊提到的《選項(xiàng)》功能,如
>db.collectionName.remove({"name":"zhangsan"},true)
則只會(huì)刪除所有name符合zhangsan的其中一條文檔數(shù)據(jù)
3.改操作:update
語(yǔ)法:db.collectionName.update(查詢表達(dá)式,新值,選項(xiàng))
1)查詢表達(dá)式是指需要修改誰(shuí),新值是指改成什么樣,選項(xiàng)是指可選參數(shù)
例如:
>db.collectionName.update({name:'zhangfei'},{name:'zhangfeifei'})
查看一下更改結(jié)果
>db.collectionName.find()
將會(huì)發(fā)現(xiàn)修改后的文檔中就剩下id和name列了,而sn列不見(jiàn)了
原因:新文檔直接替換了舊的文檔,而不是修改
2)但是我們可以使用$set來(lái)指定修改某一列
>db.collectionName.update({name:'guanyu'},{$set:{name:'guanyunchang'}})
修改時(shí)的賦值表達(dá)式
$set 修改某個(gè)列的值
$unset 刪除某個(gè)列
$rename 重命名某個(gè)列
$inc 增大某個(gè)列的值
3)來(lái)一個(gè)復(fù)雜的更新操作
先插入一條數(shù)據(jù)
>db.collectionName.insert({name:'caocao',age:40,sex:'m',addr:'wei')
修改這條數(shù)據(jù)
>db.collectionName.update({name:'caocao'},{$set:{name:'caoaman'},$unset:{addr:1},$rename:{sex:'gender'},$inc:{age:10}})
4)第三個(gè)可選參數(shù)option的作用:
{upsert:true/false,multi:true/false}
upsert是指沒(méi)有匹配的行,則直接插入該行。(和MySQL中的replace類似)
例如:
>db.collectionName.update({_id:100},{name:'liubei'},{upsert:true})
如果沒(méi)有_id為100的文檔,則直接插入該文檔。
注意:如果既沒(méi)有_id為100的文檔,又沒(méi)有upsert可選參數(shù),則該跟新操作不會(huì)對(duì)表中的文檔造成影響。
multi是指要不要改多行
即如果查詢表達(dá)式匹配到多行默認(rèn)情況下只會(huì)更改一行,如果要想修改多行,則需要使用此選項(xiàng)。
例如:
>db.collectionName.update({sex:'m'},$set:{sex:'w'},{multi:true})
會(huì)把collectionName中所有sex=m的文檔都修改為sex=w
4.查操作:find,findOne
語(yǔ)法:db.collection.find(查詢表達(dá)式,查詢的列)
例如:
1)查詢所有文檔
>db.collectionName.find()
2)查詢所有文檔的sex屬性(列)
>db.collectionName.find({},{sex:1})
3)查詢所有文檔的sex屬性,不查詢_id屬性
>db.collectionName.find({},{sex:1,_id:0})
注意:無(wú)論增刪改查都離不開(kāi)一個(gè)查詢表達(dá)式,以上的示例都是比較簡(jiǎn)單的入門操作