MongoDB與關(guān)系型數(shù)據(jù)庫(kù)對(duì)比
MongoDB屬于文檔型的非關(guān)系型數(shù)據(jù)庫(kù)勿锅,其他像Redis就屬于鍵值對(duì)型的非關(guān)系型數(shù)據(jù)庫(kù)云石。對(duì)于MongodDB來(lái)說(shuō)它是最接近關(guān)系型數(shù)據(jù)庫(kù)的。因此碰缔,如果有使用Oracle嚼隘、Mysql的話,會(huì)很快上手MongoDB辜膝。
集合:在傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)中以表(table)的方式組織數(shù)據(jù)无牵,而在MongoDB中取而代之的是集合(collection),也就是說(shuō)厂抖,在MongoDB數(shù)據(jù)庫(kù)中沒(méi)有一張張表茎毁,而是一個(gè)個(gè)集合,集合的作用可以理解為表忱辅。
文檔:在傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的表中有一行行記錄(row)七蜘,而在MongoDB中取而代之的是文檔(document),MongoDB是用文檔來(lái)表示數(shù)據(jù)的墙懂。文檔的格式類似json的格式橡卤,例如,
{name:"張三",age:20}
损搬。
下載
從MongoDB的官網(wǎng) https://www.mongodb.org/ 上下載對(duì)應(yīng)自己系統(tǒng)的版本,我下載的是最新的穩(wěn)定版3.0.6碧库。我為了講解需要下載的是解壓版,接下來(lái)會(huì)一步一步配置數(shù)據(jù)庫(kù)巧勤。如果覺(jué)得麻煩可以通過(guò)軟件源的方式安裝嵌灰,可以參考Install on Linux。
安裝配置
-
將下載好的壓縮包解壓颅悉,發(fā)現(xiàn)有一個(gè)
bin
文件夾沽瞭,里面有許多命令腳本程序,介紹兩個(gè)最常用的剩瓶,下面演示會(huì)用到:-
mongod
: 啟動(dòng)數(shù)據(jù)庫(kù)用的命令 -
mongo
: 作為數(shù)據(jù)庫(kù)的客戶端驹溃,去連接本地或遠(yuǎn)程的數(shù)據(jù)庫(kù)
-
創(chuàng)建一個(gè)文件夾作為練習(xí)MongoDB的目錄,文件夾的名字任意起個(gè)就行延曙,比如叫mongodb豌鹤,文件夾的位置任意。
-
將第一步解壓的bin文件夾復(fù)制到第二步創(chuàng)建的mongodb文件夾中搂鲫,接著在mongodb文件夾里面再創(chuàng)建如下三個(gè)文件夾:
-
conf
: 啟動(dòng)數(shù)據(jù)庫(kù)的配置文件會(huì)存到這個(gè)文件夾里 -
db
: 數(shù)據(jù)庫(kù)存儲(chǔ)的位置 -
log
: 數(shù)據(jù)庫(kù)日志文件會(huì)存到這個(gè)文件夾里傍药,順便在log文件夾下新建一個(gè)mongodb.log的空文件用來(lái)記錄日志
-
-
請(qǐng)?jiān)赾onf文件夾下新建mongod.conf文件磺平,作為啟動(dòng)數(shù)據(jù)庫(kù)的配置文件魂仍。MongoDB 2.6 以前的版本配置文件采用鍵值對(duì)的方式配置拐辽,使用軟件源安裝的話生成的配置文件就是這種格式,從2.6以后MongoDB采用
YAML
格式進(jìn)行配置(當(dāng)然鍵值對(duì)的格式也是可以的擦酌,MongoDB的后續(xù)版本都兼容鍵值對(duì)格式俱诸。),本教程將采用YAML
格式來(lái)配置赊舶,其實(shí)YAML
格式也很簡(jiǎn)單(具體可以參考MongoDB官方文檔 http://docs.mongodb.org/manual/reference/configuration-options/)睁搭。以下是配置文件內(nèi)容:# 配置數(shù)據(jù)庫(kù)綁定的IP和端口號(hào) net: bindIp: 127.0.0.1 port: 27017 # 配置數(shù)據(jù)庫(kù)日志的位置,且日志以追加的方式記錄 systemLog: destination: file path: /Users/xinyiming/Develop/mongodb/log/mongodb.log logAppend: true # 配置數(shù)據(jù)庫(kù)存儲(chǔ)的位置笼平,journal用于故障恢復(fù)园骆,在生產(chǎn)環(huán)境下必須開(kāi)啟 storage: dbPath: /Users/xinyiming/Develop/mongodb/db journal: enabled: true # fork配置為true,則數(shù)據(jù)庫(kù)以后臺(tái)進(jìn)程的方式啟動(dòng)寓调,不會(huì)阻塞當(dāng)前命令窗口锌唾。注意windows下沒(méi)有這個(gè)參數(shù) processManagement: fork: true # 認(rèn)證配置,默認(rèn)是無(wú)需用戶名密碼的夺英,如果想開(kāi)啟認(rèn)證晌涕,必須先在數(shù)據(jù)庫(kù)中添加用戶名、密碼及權(quán)限 security: authorization: disabled
以上就是最基本的配置了痛悯,
#
開(kāi)頭的是注釋余黎,縮進(jìn)不要用tab
鍵,用2到3個(gè)空格來(lái)縮進(jìn)载萌,在配置項(xiàng)的:
后面有個(gè)空格惧财,不然啟動(dòng)時(shí)會(huì)報(bào)錯(cuò)。
啟動(dòng)數(shù)據(jù)庫(kù)
完成上述配置后就可以啟動(dòng)數(shù)據(jù)庫(kù)了扭仁,在bin目錄下執(zhí)行mongod命令
./mongod -f ../conf/mongod.conf
-f
指定數(shù)據(jù)庫(kù)啟動(dòng)時(shí)加載的配置文件(實(shí)際上如果沒(méi)有配置文件可缚,可以直接在mongod后面跟上參數(shù)也可以,但不如配置文件方便斋枢,可以使用./mongod -h
命令查看具體有哪些參數(shù))
這樣一個(gè)數(shù)據(jù)庫(kù)實(shí)例就啟動(dòng)成功了帘靡,如果有錯(cuò)誤會(huì)顯示在控制臺(tái)上,請(qǐng)檢查配置文件是否正確瓤帚。
連接數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)啟動(dòng)好之后就可以使用客戶端進(jìn)行連接了描姚。MongoDB官方自帶了一個(gè)客戶端工具,就是上面提到的mongo
命令戈次。繼續(xù)在bin目錄下執(zhí)行
./mongo
或./mongo 127.0.0.1:27017
不帶ip和端口號(hào)轩勘,默認(rèn)會(huì)連127.0.0.1:27017。默認(rèn)會(huì)連接到test數(shù)據(jù)庫(kù)怯邪,連接成功后绊寻,顯示如下消息
MongoDB shell version: 3.0.6
connecting to: test
>
并顯示操作數(shù)據(jù)庫(kù)的命令提示符,以后就可以在這里通過(guò)命令來(lái)操作數(shù)據(jù)庫(kù)了。mongo shell提供了很多方法(可以參考mongo Shell Methods)澄步,這里可以輸入help
查看可以使用哪些方法冰蘑。
使用命令操作數(shù)據(jù)庫(kù)
-
使用
show dbs
可以列出當(dāng)前有哪些數(shù)據(jù)庫(kù)> show dbs local 0.078GB
目前只顯示出一個(gè)local數(shù)據(jù)庫(kù),這是MongoDB自帶的村缸,雖然我們連的是test數(shù)據(jù)庫(kù)祠肥,可test沒(méi)有數(shù)據(jù)因此不顯示出來(lái)
-
在test數(shù)據(jù)庫(kù)中添加一個(gè)user集合,并插入一條數(shù)據(jù)梯皿,結(jié)果返回WriteResult對(duì)象仇箱,包括影響的記錄數(shù)
> db.user.insert({name:"張三",age:14}) WriteResult({ "nInserted" : 1 })
user集合不需要提前創(chuàng)建,我們?cè)偬砑右粭l數(shù)據(jù)东羹,這次增加一個(gè)字段
> db.user.insert({name:"李四",age:15,address:"北京"}) WriteResult({ "nInserted" : 1 })
雖然多了個(gè)字段剂桥,依然能存進(jìn)去,這說(shuō)明MongoDB的可擴(kuò)展性很強(qiáng)属提。隨著項(xiàng)目的進(jìn)行渊额,業(yè)務(wù)變得復(fù)雜,剛開(kāi)始定義的字段不夠用了垒拢,需要擴(kuò)展字段,使用MongoDB的話就無(wú)需修改表結(jié)構(gòu)求类。關(guān)于insert方法詳細(xì)介紹http://docs.mongodb.org/manual/tutorial/insert-documents/奔垦。
再次查詢有哪些數(shù)據(jù)庫(kù),這時(shí)就會(huì)顯示出test數(shù)據(jù)庫(kù)了尸疆。
> show dbs local 0.078GB test 0.078GB
-
查詢剛才添加的數(shù)據(jù)
> db.user.find() { "_id" : ObjectId("561923d311f16927acb1ff79"), "name" : "張三", "age" : 14 } {"_id" : ObjectId("561a475611f16927acb1ff7a"), "name" : "李四", "age" : 15, "address" : "北京" }
返回的數(shù)據(jù)中
_id
是在插入數(shù)據(jù)時(shí)MongoDB自動(dòng)加入的主鍵椿猎,find方法可以傳入過(guò)濾條件,如:db.user.find({name:"張三"})寿弱,這樣就只返回name是張三的數(shù)據(jù)了犯眠。關(guān)于find方法詳細(xì)介紹http://docs.mongodb.org/manual/tutorial/query-documents/。 -
更新一條數(shù)據(jù)
> db.user.update({name:"張三"},{$set:{age:20}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find() { "_id" : ObjectId("561923d311f16927acb1ff79"), "name" : "張三", "age" : 20 } { "_id" : ObjectId("561a475611f16927acb1ff7a"), "name" : "李四", "age" : 15, "address" : "北京" }
使用update方法更新張三的年齡為20症革,update方法接收了兩個(gè)參數(shù)筐咧,第一個(gè)參數(shù)作用類似于sql中的where條件,第二個(gè)參數(shù)用于修改具體的字段噪矛,
$set
是MongoDB內(nèi)置的修改器量蕊。MongoDB還提供其他修改器,詳情可以參見(jiàn)https://docs.mongodb.org/manual/reference/operator/update/艇挨。注意残炮,這里的更新操作只會(huì)作用匹配到得第一條數(shù)據(jù)上,只會(huì)更新一條數(shù)據(jù)缩滨,如果有兩個(gè)張三的話势就,那么第二條數(shù)據(jù)就不會(huì)更新泉瞻,如果要更新多條數(shù)據(jù),需要在update方法傳入第三個(gè)參數(shù)
{ multi: true }
苞冯,update方法還可以接收其他參數(shù)袖牙,具體可以參見(jiàn)http://docs.mongodb.org/manual/tutorial/modify-documents/。 -
刪除數(shù)據(jù)
> db.user.remove({name:"張三"}) WriteResult({ "nRemoved" : 1 }) > db.user.find() { "_id" : ObjectId("561a475611f16927acb1ff7a"), "name" : "李四", "age" : 15, "address" : "北京" }
使用remove方法刪除張三的數(shù)據(jù)抱完,remove方法接收一個(gè)參數(shù)贼陶,該參數(shù)作用類似于sql中where條件刃泡,如果要?jiǎng)h除user中所有的數(shù)據(jù)巧娱,則使用
db.user.remove({})
,如果要?jiǎng)h除user集合烘贴,則使用db.user.drop()
方法禁添,刪除詳情可以參見(jiàn)http://docs.mongodb.org/manual/tutorial/remove-documents/。
開(kāi)啟認(rèn)證
-
進(jìn)入
admin
數(shù)據(jù)庫(kù)桨踪,創(chuàng)建root用戶> use admin > db.createUser( { user: "用戶名", pwd: "密碼", roles: [ { role: "root", db: "admin" } ] }); > exit
修改mongod.conf中認(rèn)證配置
authorization: enabled
-
重啟數(shù)據(jù)庫(kù)
使用
ps -ef | grep mongod
命令老翘,打印出MongoDB的后臺(tái)進(jìn)程,得到該進(jìn)程的pid锻离,再使用kill -15 pid
殺掉進(jìn)程铺峭,再啟動(dòng)MongoDB數(shù)據(jù)庫(kù),此時(shí)再使用mongo
命令連接上數(shù)據(jù)庫(kù)后汽纠,無(wú)法進(jìn)行任何增刪改查操作卫键。 -
登錄認(rèn)證
> use admin > db.auth("用戶名","密碼");
之后就可以順利操作了。
結(jié)束
我也剛接觸MongoDB沒(méi)多久虱朵,我覺(jué)得MongoDB上手還是很簡(jiǎn)單的莉炉,把我學(xué)習(xí)的過(guò)程總結(jié)下來(lái)分享給大家。