MongoDB與關系型數據庫對比
MongoDB屬于文檔型的非關系型數據庫,其他像Redis就屬于鍵值對型的非關系型數據庫。對于MongodDB來說它是最接近關系型數據庫的。因此,如果有使用Oracle、Mysql的話,會很快上手MongoDB。
集合:在傳統關系型數據庫中以表(table)的方式組織數據,而在MongoDB中取而代之的是集合(collection),也就是說,在MongoDB數據庫中沒有一張張表,而是一個個集合,集合的作用可以理解為表。
文檔:在傳統關系型數據庫的表中有一行行記錄(row),而在MongoDB中取而代之的是文檔(document),MongoDB是用文檔來表示數據的。文檔的格式類似json的格式,例如,
{name:"張三",age:20}
。
下載
從MongoDB的官網 https://www.mongodb.org/ 上下載對應自己系統的版本,我下載的是最新的穩定版3.0.6。我為了講解需要下載的是解壓版,接下來會一步一步配置數據庫。如果覺得麻煩可以通過軟件源的方式安裝,可以參考Install on Linux。
安裝配置
-
將下載好的壓縮包解壓,發現有一個
bin
文件夾,里面有許多命令腳本程序,介紹兩個最常用的,下面演示會用到:-
mongod
: 啟動數據庫用的命令 -
mongo
: 作為數據庫的客戶端,去連接本地或遠程的數據庫
-
創建一個文件夾作為練習MongoDB的目錄,文件夾的名字任意起個就行,比如叫mongodb,文件夾的位置任意。
-
將第一步解壓的bin文件夾復制到第二步創建的mongodb文件夾中,接著在mongodb文件夾里面再創建如下三個文件夾:
-
conf
: 啟動數據庫的配置文件會存到這個文件夾里 -
db
: 數據庫存儲的位置 -
log
: 數據庫日志文件會存到這個文件夾里,順便在log文件夾下新建一個mongodb.log的空文件用來記錄日志
-
-
請在conf文件夾下新建mongod.conf文件,作為啟動數據庫的配置文件。MongoDB 2.6 以前的版本配置文件采用鍵值對的方式配置,使用軟件源安裝的話生成的配置文件就是這種格式,從2.6以后MongoDB采用
YAML
格式進行配置(當然鍵值對的格式也是可以的,MongoDB的后續版本都兼容鍵值對格式。),本教程將采用YAML
格式來配置,其實YAML
格式也很簡單(具體可以參考MongoDB官方文檔 http://docs.mongodb.org/manual/reference/configuration-options/)。以下是配置文件內容:# 配置數據庫綁定的IP和端口號 net: bindIp: 127.0.0.1 port: 27017 # 配置數據庫日志的位置,且日志以追加的方式記錄 systemLog: destination: file path: /Users/xinyiming/Develop/mongodb/log/mongodb.log logAppend: true # 配置數據庫存儲的位置,journal用于故障恢復,在生產環境下必須開啟 storage: dbPath: /Users/xinyiming/Develop/mongodb/db journal: enabled: true # fork配置為true,則數據庫以后臺進程的方式啟動,不會阻塞當前命令窗口。注意windows下沒有這個參數 processManagement: fork: true # 認證配置,默認是無需用戶名密碼的,如果想開啟認證,必須先在數據庫中添加用戶名、密碼及權限 security: authorization: disabled
以上就是最基本的配置了,
#
開頭的是注釋,縮進不要用tab
鍵,用2到3個空格來縮進,在配置項的:
后面有個空格,不然啟動時會報錯。
啟動數據庫
完成上述配置后就可以啟動數據庫了,在bin目錄下執行mongod命令
./mongod -f ../conf/mongod.conf
-f
指定數據庫啟動時加載的配置文件(實際上如果沒有配置文件,可以直接在mongod后面跟上參數也可以,但不如配置文件方便,可以使用./mongod -h
命令查看具體有哪些參數)
這樣一個數據庫實例就啟動成功了,如果有錯誤會顯示在控制臺上,請檢查配置文件是否正確。
連接數據庫
數據庫啟動好之后就可以使用客戶端進行連接了。MongoDB官方自帶了一個客戶端工具,就是上面提到的mongo
命令。繼續在bin目錄下執行
./mongo
或./mongo 127.0.0.1:27017
不帶ip和端口號,默認會連127.0.0.1:27017。默認會連接到test數據庫,連接成功后,顯示如下消息
MongoDB shell version: 3.0.6
connecting to: test
>
并顯示操作數據庫的命令提示符,以后就可以在這里通過命令來操作數據庫了。mongo shell提供了很多方法(可以參考mongo Shell Methods),這里可以輸入help
查看可以使用哪些方法。
使用命令操作數據庫
-
使用
show dbs
可以列出當前有哪些數據庫> show dbs local 0.078GB
目前只顯示出一個local數據庫,這是MongoDB自帶的,雖然我們連的是test數據庫,可test沒有數據因此不顯示出來
-
在test數據庫中添加一個user集合,并插入一條數據,結果返回WriteResult對象,包括影響的記錄數
> db.user.insert({name:"張三",age:14}) WriteResult({ "nInserted" : 1 })
user集合不需要提前創建,我們再添加一條數據,這次增加一個字段
> db.user.insert({name:"李四",age:15,address:"北京"}) WriteResult({ "nInserted" : 1 })
雖然多了個字段,依然能存進去,這說明MongoDB的可擴展性很強。隨著項目的進行,業務變得復雜,剛開始定義的字段不夠用了,需要擴展字段,使用MongoDB的話就無需修改表結構。關于insert方法詳細介紹http://docs.mongodb.org/manual/tutorial/insert-documents/。
再次查詢有哪些數據庫,這時就會顯示出test數據庫了。
> show dbs local 0.078GB test 0.078GB
-
查詢剛才添加的數據
> db.user.find() { "_id" : ObjectId("561923d311f16927acb1ff79"), "name" : "張三", "age" : 14 } {"_id" : ObjectId("561a475611f16927acb1ff7a"), "name" : "李四", "age" : 15, "address" : "北京" }
返回的數據中
_id
是在插入數據時MongoDB自動加入的主鍵,find方法可以傳入過濾條件,如:db.user.find({name:"張三"}),這樣就只返回name是張三的數據了。關于find方法詳細介紹http://docs.mongodb.org/manual/tutorial/query-documents/。 -
更新一條數據
> 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方法接收了兩個參數,第一個參數作用類似于sql中的where條件,第二個參數用于修改具體的字段,
$set
是MongoDB內置的修改器。MongoDB還提供其他修改器,詳情可以參見https://docs.mongodb.org/manual/reference/operator/update/。注意,這里的更新操作只會作用匹配到得第一條數據上,只會更新一條數據,如果有兩個張三的話,那么第二條數據就不會更新,如果要更新多條數據,需要在update方法傳入第三個參數
{ multi: true }
,update方法還可以接收其他參數,具體可以參見http://docs.mongodb.org/manual/tutorial/modify-documents/。 -
刪除數據
> db.user.remove({name:"張三"}) WriteResult({ "nRemoved" : 1 }) > db.user.find() { "_id" : ObjectId("561a475611f16927acb1ff7a"), "name" : "李四", "age" : 15, "address" : "北京" }
使用remove方法刪除張三的數據,remove方法接收一個參數,該參數作用類似于sql中where條件,如果要刪除user中所有的數據,則使用
db.user.remove({})
,如果要刪除user集合,則使用db.user.drop()
方法,刪除詳情可以參見http://docs.mongodb.org/manual/tutorial/remove-documents/。
開啟認證
-
進入
admin
數據庫,創建root用戶> use admin > db.createUser( { user: "用戶名", pwd: "密碼", roles: [ { role: "root", db: "admin" } ] }); > exit
修改mongod.conf中認證配置
authorization: enabled
-
重啟數據庫
使用
ps -ef | grep mongod
命令,打印出MongoDB的后臺進程,得到該進程的pid,再使用kill -15 pid
殺掉進程,再啟動MongoDB數據庫,此時再使用mongo
命令連接上數據庫后,無法進行任何增刪改查操作。 -
登錄認證
> use admin > db.auth("用戶名","密碼");
之后就可以順利操作了。
結束
我也剛接觸MongoDB沒多久,我覺得MongoDB上手還是很簡單的,把我學習的過程總結下來分享給大家。