CouchDB快速入門
Apache CouchDB數據庫,它類似於Redis,Cassandra和MongoDB,也是一個NoSQL數據庫。 CouchDB將數據存儲爲非關係性的JSON文檔。 這使得CouchDB的用戶可以以與現實世界相似的方式來存儲數據。
可以從命令行或一個叫作Futon的Web界面來管理CouchDB。 Futon可用於執行管理任務,如創建和操作CouchDB的數據庫,文檔和用戶等。
本文章的目標
在閱讀學習本文完後,您將學會以下知識:
- 將CouchDB安裝在運行Ubuntu 14.04上。
- 將Futon安裝在同一臺服務器上
- 使用安全通道從本地機器訪問CouchDB
- 向CouchDB添加管理員用戶
- 如何使用Futon執行CouchDB的CRUD操作
- 從命令行執行CouchDB的CRUD操作
先決條件
請準備/完成以下兩個先決條件:
- Ubuntu 14.04系統
- 擁有管理權限的用戶身份登錄到服務器
注意:本教程假設使用的是非root用戶,並可以執行root用戶權限。請注意,如果您使用非root用戶,首次使用sudo執行命令時,系統將要求您輸入root用戶的密碼。
步驟1 - 準備服務器
在安裝CouchDB之前,需要確保已經設置好了服務器。
開始更新系統:
$ sudo apt-get update
安裝允許管理源存儲庫的軟件:
$ sudo apt-get install software-properties-common -y
注意:-y標誌告訴apt-get命令對安裝過程中可能出現的所有提示以Yes響應。 如果您喜歡手動響應提示,可以刪除此標誌。
添加PPA,以從相應的存儲庫獲取最新的CouchDB版本:
$ sudo add-apt-repository ppa:couchdb/stable -y
警告:在您的服務器上添加一個新的個人包存檔(PPA)時,應該非常小心。 因爲任何人都可以創建PPA,所以不能保證它是可信賴的,或者它是安全的。 在這種情況下,上述PPA是由Apache CouchDB團隊維護的官方PPA。
經過上一步,已經添加了一個新的PPA,接下來需要更新系統,使其具有最新的包信息:
$ sudo apt-get update
現在可以安裝CouchDB和Futon了。
步驟2 - 安裝CouchDB
如果之前有在此服務器上安裝過CouchDB,請先刪除現有版本,使用以下命令:
$ sudo apt-get remove couchdb couchdb-bin couchdb-common -yf
現在安裝CouchDB:
$ sudo apt-get install couchdb -y
這將在您服務器上安裝CouchDB和Futon。
默認情況下,CouchDB在localhost上並使用端口5984運行,可以通過從命令行運行curl來檢索此基本信息:
$ curl localhost:5984
注意:如果沒有安裝curl程序工具,可以使用sudo apt-get install curl命令進行安裝。
執行上面命令請求,應該得到類似於以下內容:
{"couchdb":"Welcome","uuid":"b9dsf278cfdas743b5fdfsaafd399fas7582e","version":"1.6.1","vendor":{"name":"Ubuntu","version":"14.04"}}
現在可以使用curl -X PUT命令創建一個新的數據庫:
curl -X PUT localhost:5984/new_database
執行後返回的響應結果如下 -
{"ok":true}
步驟3 - CouchDB安全保護
默認情況下,安裝CouchDB時創建的某些文件和目錄屬於root用戶和組。 這在開發過程中雖然不錯,但這可能是生產中的安全風險。
安裝CouchDB時,它將創建一個用戶和一個名爲couchdb的組。 在本節中,我們將把CouchDB文件的所有權和權限更改爲couchdb用戶和組。
更改所有權控制CouchDB進程可以訪問內容,並更改可以訪問CouchDB文件和目錄的權限控制。
更改所有權和權限之前,先停止CouchDB:
$ sudo stop couchdb
更改/usr/lib/couchdb,/usr/share/couchdb和/etc/couchdb目錄, 以及/usr/bin/couchdb可執行文件的所有權,使其所有者爲couchdb用戶,並且屬於couchdb組。
sudo chown -R couchdb:couchdb /usr/lib/couchdb /usr/share/couchdb /etc/couchdb /usr/bin/couchdb
現在,更改了/usr/lib/couchdb,/usr/share/couchdb和/etc/couchdb目錄, 以及/usr/bin/couchdb可執行文件的權限,以便couchdb用戶和couchdb組可自由訪問(到CouchDB安裝),而其他用戶不可以訪問這些文件和目錄。
sudo chmod -R 0770 /usr/lib/couchdb /usr/share/couchdb /etc/couchdb /usr/bin/couchdb
現在重新啓動CouchDB:
sudo start couchdb
CouchDB現在應該啓動並運行,而沒有任何屬於root用戶或root組的文件或目錄。
步驟4 - 訪問Futon
CouchDB提供了一個基於Web的方便控制面板,它叫作:Futon。從本地服務器訪問它,將流量通過SSH連接隧道傳輸到您的服務器。只有SSH登錄到您的服務器的用戶才能訪問Futon控制面板。
要安全地連接到CouchDB(不用公開),您可以創建從本地端口5984到遠程服務器端口5984的SSH隧道。
可以使用以下命令在本地計算機運行,以設置隧道:
$ ssh -L5984:127.0.0.1:5984 yiibai_user@your_server_ip
注意:請記住用您的用戶名替換yiibai_user,將your_server_ip替換爲服務器的IP地址。
連接打開時,使用端口5984從Web瀏覽器訪問Futon。訪問此URL以顯示Futon頁面:
默認情況下,訪問Futon的所有CouchDB用戶都具有管理權限。如在右下角所示:
可以通過點擊修復此(Fix this)鏈接並創建新管理員來更改此內容。
步驟5 - 添加管理員用戶
現在已經啓動運行CouchDB,可以開始使用它了。
在創建管理員用戶之前,所有用戶都可以以管理權限訪問CouchDB(儘管它們首先需要SSH訪問服務器)。
爲CouchDB創建管理員帳戶是一個很好的做法,以防止意外或未經授權的數據丟失。
要執行此操作,請單擊顯示在「Futon」的右下角的「修復此(Fix this)」鏈接。 這將顯示一個允許您創建CouchDB管理員用戶的屏幕,如下所示:
輸入用戶名和密碼:
輸入新的CouchDB用戶名和密碼後,單擊*創建(Create)*按鈕然後就創建新的管理員用戶。 Futon右下角的消息將通過顯示類似於以下內容的消息來確認:
注意:創建管理用戶可防止未經授權的用戶刪除和修改數據庫,設計文檔和CouchDB配置。 但是,它不會阻止其它創建或訪問文檔。
就這樣,有關CouchDB服務器現已完全配置。要了解有關使用數據庫的更多信息,請繼續閱讀。
下面是一條美麗的分割線…
上面是一條美麗的分割線…
從Futon執行CRUD操作
Futon有一個非常簡單但有用的用戶界面,用來執行基本的CRUD操作(創建,讀取,更新和刪除)。
在本節中,我們將創建一個名爲todos的新數據庫,向其中添加一個新文檔,然後檢索,更新和刪除此文檔。
注意:如果您已創建管理員用戶,則必須以管理員身份登錄才能創建新的數據庫。
創建數據庫和文檔
要創建一個名爲todos的新數據庫,請單擊屏幕的左上方的**創建數據庫(Create Database)**鏈接。 這將出現類似如下對話框:
輸入數據庫的名稱:todos,然後單擊創建按鈕。
這將創建一個名爲todos的新數據庫,並轉到可以在新創建的數據庫中創建和修改文檔的頁面。
創建文檔
要創建新文檔,請單擊頁面上的「**新建文檔(New Document)**」鏈接。
這將打開一個帶有新文檔的屏幕。 這個文檔默認只有_id字段。 如果需要,您可以更改此字段的值,也可以按原樣保留。
單擊*添加字段(Add Field)*鏈接以向此文檔添加新字段。
如上所述,我們添加了兩個名爲todo和done的字段。 默認情況下,新字段具有空(null)值。可通過雙擊該值以更改它。
在這個例子中,我們雙擊了todo和done的值字段,並分別輸入了Task 1和false。
輸入值後,按ENTER鍵或點擊字段旁邊的小綠色複選標記來保存內容(不這樣做會使該字段的值爲空)。這應該如下所示:
要保存文檔,請單擊「**保存文檔(Save Document)**」鏈接。 保存文檔後,您將看到已經添加了_rev字段,如下所示:
讀取文件
單擊todos鏈接(在「*概覽(Overview)*」鏈接旁邊的頂部欄中)查看新創建的文檔,現在它是todos數據庫中的唯一文檔。
單擊表格中的文檔(ID)的鍵(紅色部分),以訪問文檔詳細信息頁面。
編輯文檔
在此頁面上,可以編輯和更新文檔字段,如下:
要編輯字段值,可雙擊對應字段並開始編輯。
您可以刪除任何字段(除了_id和_rev字段外),添加新字段,或更改現有字段的值。 在這個例子中,已經將done字段的值從false更改爲true,如下所示:
刪除文檔
要刪除文檔,可以單擊刪除文檔鏈接,該鏈接將提示您進行確認:
按*刪除(Delete)*按鈕進行確認。
Futon將刪除文檔並跳轉到todos數據庫頁面,該頁面中文檔現在應爲空,確認文檔確實已被刪除。
從命令行執行CRUD操作
本節將說明如何使用curl從命令行在CouchDB數據庫上執行基本的CRUD(創建,讀取,更新和刪除)操作。
創建數據庫
如果您尚未創建數據庫new_database,請按照以下步驟現在來創建。 該命令應從安裝CouchDB數據庫的服務器上執行:
curl -X PUT http://localhost:5984/new\_database -u "admin:password"
{"ok":true}
由於之前我們向CouchDB添加了管理員用戶,因此現在必須在創建新的數據庫時發送管理員用戶名和密碼。
結果應如下所示:
{"ok":true}
創建文檔
我們先來創建一個新的文檔,使用以下請求命令:
curl -X POST -d '{"todo":"task 1", "done":false}' http://localhost:5984/new\_database -H "Content-Type:application/json"
此命令將在new_database數據庫中創建一個新文檔。
-X標誌表示執行HTTP POST方法請求操作。 由於POST方法請求發送一個JSON文檔,所以後面的-H標誌將此請求的內容類型設置爲application/json。 最後,包含了JSON文檔本身,使用-d標誌。
此操作的響應結果如下:
{"ok":true,"id":"803da996e1524591ce773d24400004ff","rev":"1-2fc1d70532433c39c9f61480607e3681"}
此響應的部分"ok":true表示操作成功。 響應包括分別代表文檔ID和文檔修訂的字段id和rev。 需要修改或刪除此文檔時,才需要這兩個字段。
在此示例中,文檔ID由CouchDB生成,因爲沒有提供該命令。 如果需要,可以創建一個具有生成唯一ID的文檔。
用指定的ID創建
創建一個ID爲random_task的文檔:
curl -X POST -d '{"_id":"random_task", "todo":"task 2", "done":false}' http://localhost:5984/new\_database -H "Content-Type:application/json"
此命令創建一個ID爲random_task的新文檔,對此命令的響應如下:
{"ok":true,"id":"random_task","rev":"1-bceeae3c4a9154c87db1649473316e44"}
創建多個文檔
除了創建單個文檔,還可以批量創建文檔。
curl -X POST -d '{"docs": [{"todo":"task 3", "done":false}, {"todo":"task 4", "done":false}]}' http://localhost:5984/new\_database/\_bulk\_docs -H "Content-Type:application/json"
該命令將在POST正文中指定創建兩個文檔。 與單個文檔插入相比,有兩個微小的差異:
在插入單個文檔時,POST正文只是一個標準的JSON對象。 在批量插入的情況下,POST正文包含具有文檔字段的對象。 該字段保存要插入的文檔數組。
在插入單個文檔時,POST請求已發送到指向數據庫的URL(http://localhost:5984/new\_database)。 但是,對批量插入請求,URL爲:URL:http://localhost:5984/new\_database/\_bulk\_docs。
批量插入操作的響應如下:
[{"ok":true,"id":"803da996e1524591ce773d24400007df","rev":"1-778fd61f8f460d0c1df1bb174279489d"},{"ok":true,"id":"803da996e1524591ce773d2440001723","rev":"1-dc9e84861bba58e5cfefeed8f5133636"}]
讀取文件
可通過發出HTTP GET命令來從CouchDB數據庫檢索文檔。現在嘗試檢索上面創建的一個文檔:一個叫random_task的文件。
curl -X GET http://localhost:5984/new\_database/random\_task
請注意,URL包括正在檢索的文檔的ID(random_task)。如下所示,對此GET請求的響應包含整個文檔以及_id和_rev字段,可用於更新或刪除此文檔。
{"_id":"random_task","_rev":"1-bceeae3c4a9154c87db1649473316e44","todo":"task 2","done":false}
更新文檔
在要更新文檔時,包含_rev字段很重要。 CouchDB將拒絕任何不包含_rev字段的更新請求。 由於CouchDB更新整個文檔,而不僅僅是其中的一部分,所以在更新操作期間,必須在請求正文中發送整個文檔。
要更新使用ID爲random_task的文檔,我們需要發出HTTP PUT請求,如下所示:
curl -X PUT -d '{"_rev":"1-bceeae3c4a9154c87db1649473316e44", "todo":"task 2", "done":true}' http://localhost:5984/new\_database/random\_task
因爲每個_rev值可能不太一樣,所以請確保將_rev值替換爲上一個輸出中接收到的字符串。
這將修改文檔並將done字段更新爲true。 對此請求的響應如下:
{"ok":true,"id":"random_task","rev":"2-4cc3dfb6e76befd665faf124b36b7f1c"}
從響應中可以看出,該指定文檔的rev字段在更新後會發生更改。 任何將來更新或刪除此文檔的請求現在都必須使用最新的rev值。
刪除文檔
使用HTTP DELETE請求要指定包含這個新的rev值來刪除這個文檔,如下所示:
curl -X DELETE http://localhost:5984/new\_database/random\_task?rev=2-4cc3dfb6e76befd665faf124b36b7f1c
就像上面的GET&PUT請求一樣,DELETE請求使用指向文檔的URL。但是,它還包括URL中的附加查詢參數。 該參數rev應具有刪除操作成功的最新_rev值。
在這種特殊情況下,使用上一步中更新操作後返回的值。 對上述請求的響應如下所示。
{"ok":true,"id":"random_task","rev":"3-07d6cde68be2a559497ec263045edc9d"}
重新啓動,停止和啓動CouchDB服務
啓動,停止和重新啓動CouchDB服務是非常簡單的。下面我們來看看如何從服務器完成這些步驟。
重新啓動CouchDB
要重新啓動正在運行的CouchDB實例,請執行以下命令:
$ sudo restart couchdb
此命令將重新啓動正在運行的CouchDB實例並顯示新實例的進程ID。如果沒有CouchDB的實例運行,執行該命令會給出一個消息:
$ restart: Unknown instance:
停止CouchDB
要停止運行的CouchDB實例,請執行以下命令:
$ sudo stop couchdb
執行此命令將停止任何正在運行的CouchDB實例,並提供如下所示的確認消息:
$ couchdb stop/waiting
啓動CouchDB
要啓動CouchDB,請執行以下命令:
$ sudo start couchdb
如果CouchDB尚未運行,則執行此命令將啓動CouchDB並提供如下所示的確認消息:
$ couchdb start/running, process 12345
如果有CouchDB實例已經運行,那麼執行上面的命令就會產生一個這樣的消息:
$ start: Job is already running: couchdb
CouchDB狀態
如果想查看CouchDB的狀態,可以使用以下命令:
$ sudo status couchdb
如果CouchDB正在運行,則會提供類似於以下內容的消息:
$ couchdb start/running, process 12345
如果CouchDB沒有運行,查看狀態將提示消息如下:
couchdb stop/waiting
結束
您現在可以在服務器上使用CouchDB的所有功能了,可以使用Futon或命令行從本地機器安全地管理CouchDB。
最後聲明:對伸手黨,需要注意的是:本教程包教不包會。