Apache CouchDB数据库,它类似于Redis,Cassandra和MongoDB,也是一个NoSQL数据库。 CouchDB将数据存储为非关系性的JSON文档。 这使得CouchDB的用户可以以与现实世界相似的方式来存储数据。
可以从命令行或一个叫作Futon的Web界面来管理CouchDB。 Futon可用于执行管理任务,如创建和操作CouchDB的数据库,文档和用户等。
在阅读学习本文完后,您将学会以下知识:
请准备/完成以下两个先决条件:
注意:本教程假设使用的是非root用户,并可以执行root用户权限。请注意,如果您使用非root用户,首次使用sudo执行命令时,系统将要求您输入root用户的密码。
在安装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了。
如果之前有在此服务器上安装过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}
默认情况下,安装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组的文件或目录。
CouchDB提供了一个基于Web的方便控制面板,它叫作:Futon。从本地服务器访问它,将流量通过SSH连接隧道传输到您的服务器。只有SSH登录到您的服务器的用户才能访问Futon控制面板。
要安全地连接到CouchDB(不用公开),您可以创建从本地端口5984到远程服务器端口5984的SSH隧道。
可以使用以下命令在本地计算机运行,以设置隧道:
$ ssh -L5984:127.0.0.1:5984 zyiz_user@your_server_ip
注意:请记住用您的用户名替换zyiz_user,将your_server_ip替换为服务器的IP地址。
连接打开时,使用端口5984从Web浏览器访问Futon。访问此URL以显示Futon页面:
http://localhost:5984/_utils
默认情况下,访问Futon的所有CouchDB用户都具有管理权限。如在右下角所示:
可以通过点击修复此(Fix this)链接并创建新管理员来更改此内容。
现在已经启动运行CouchDB,可以开始使用它了。
在创建管理员用户之前,所有用户都可以以管理权限访问CouchDB(尽管它们首先需要SSH访问服务器)。
为CouchDB创建管理员帐户是一个很好的做法,以防止意外或未经授权的数据丢失。
要执行此操作,请单击显示在“Futon”的右下角的“修复此(Fix this)”链接。 这将显示一个允许您创建CouchDB管理员用户的屏幕,如下所示:
输入用户名和密码:
输入新的CouchDB用户名和密码后,单击创建(Create)按钮然后就创建新的管理员用户。 Futon右下角的消息将通过显示类似于以下内容的消息来确认:
注意:创建管理用户可防止未经授权的用户删除和修改数据库,设计文档和CouchDB配置。 但是,它不会阻止其它创建或访问文档。
就这样,有关CouchDB服务器现已完全配置。要了解有关使用数据库的更多信息,请继续阅读。
下面是一条美丽的分割线…
上面是一条美丽的分割线…
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数据库页面,该页面中文档现在应为空,确认文档确实已被删除。
本节将说明如何使用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为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实例,请执行以下命令:
$ sudo restart couchdb
此命令将重新启动正在运行的CouchDB实例并显示新实例的进程ID。如果没有CouchDB的实例运行,执行该命令会给出一个消息:
$ restart: Unknown instance:
要停止运行的CouchDB实例,请执行以下命令:
$ sudo stop couchdb
执行此命令将停止任何正在运行的CouchDB实例,并提供如下所示的确认消息:
$ couchdb stop/waiting
要启动CouchDB,请执行以下命令:
$ sudo start couchdb
如果CouchDB尚未运行,则执行此命令将启动CouchDB并提供如下所示的确认消息:
$ couchdb start/running, process 12345
如果有CouchDB实例已经运行,那么执行上面的命令就会产生一个这样的消息:
$ start: Job is already running: couchdb
如果想查看CouchDB的状态,可以使用以下命令:
$ sudo status couchdb
如果CouchDB正在运行,则会提供类似于以下内容的消息:
$ couchdb start/running, process 12345
如果CouchDB没有运行,查看状态将提示消息如下:
couchdb stop/waiting
结束
您现在可以在服务器上使用CouchDB的所有功能了,可以使用Futon或命令行从本地机器安全地管理CouchDB。
最后声明:对伸手党,需要注意的是:本教程包教不包会。