couchdb入门指南1——环境搭建和简单的调试

1概述

CouchDB是用Erlang开发的面向文档的数据库系统,最近刚刚发布了1.0版本(2010年7月14日)。CouchDB不是一个传统的关系数据库,而是面向文档的数据库,其数据存储方式有点类似lucene的index文件格式,CouchDB最大的意义在于它是一个面向web应用的新一代存储系统,事实上,CouchDB的口号就是:下一代的Web应用存储系统。
CouchDB 可以安装在大部分 POSIX 系统上,包括 Linux® 和 Mac OS X。Version 2.2.0开始正式支持Windows (x64)。CouchDB 可以从源文件安装,也可以使用包管理器安装(比如在 Mac OS X 上使用 MacPorts)。
CouchDB 是一个* Apache Software Foundation 开源项目,根据 Apache 许可 V2.0 发布。这个开源许可允许在其他软件中使用这些源代码,并根据需要进行修改,但前提是遵从版权需知和免责声明。与许多其他开源许可一样,这个许可允许用户根据需求使用、修改和分发该软件。不一定由同一个许可包含所有修改,因为我们仅维护一个 Apache 代码使用许可需知。

2特点

一、CouchDB是分布式的数据库,他可以把存储系统分布到n台物理的节点上面,并且很好的协调和同步节点之间的数据读写一致性。这当然也得靠Erlang无与伦比的并发特性才能做到。对于基于web的大规模应用文档应用,分布式可以让它不必像传统的关系数据库那样分库拆表,在应用代码层进行大量的改动。
二、CouchDB是面向文档的数据库,存储半结构化的数据,比较类似lucene的index结构,特别适合存储文档,因此很适合CMS,电话本,地址本等应用,在这些应用场合,文档数据库要比关系数据库更加方便,性能更好。
三、CouchDB支持REST API,可以让用户使用JavaScript来操作CouchDB数据库,也可以用JavaScript编写查询语句,我们可以想像一下,用AJAX技术结合CouchDB开发出来的CMS系统会是多么的简单和方便。
其实CouchDB只是Erlang应用的冰山一角,在最近几年,基于Erlang的应用也得到的蓬勃的发展,特别是在基于web的大规模,分布式应用领域,几乎都是Erlang的优势项目。

3 使用说明

couchdb2.x版本支持多节点分布式存储,couchdb1.x版本是单节点存储,这点需要注意。

3.1 windows上的安装与调试

可以选择exe安装包来部署环境:https://couchdb.apache.org/#download
安装路径中不要出现空格等非法字符
couchdb入门指南1——环境搭建和简单的调试

3.2单节点调试

许多用户只需要单节点CouchDB 2.x安装。在操作上,它大致等效于CouchDB 1.x系列。请注意,单节点设置显然没有利用CouchDB 2.x中新的缩放和容错功能。

安装和初始启动后,请访问 http://127.0.0.1:5984/_utils#setup。系统将要求您将CouchDB设置为单节点实例或设置集群。当您单击“单节点设置”时,将要求您输入管理员用户名和密码。很好地选择它们并记住它们。

您还可以将CouchDB绑定到公共地址,因此,如果您在公共VM上执行此操作,则可以在您的LAN或公共内部访问它。或者,您可以通过仅绑定到127.0.0.1(localhost)来保持安装私有。绑定到0.0.0.0将绑定到所有地址。然后,向导将配置您的管理员用户名和密码_users, _replicator并_global_changes为您创建三个系统数据库。
couchdb入门指南1——环境搭建和简单的调试
couchdb入门指南1——环境搭建和简单的调试
由于这里笔者电脑数目有限,无法调试多节点存储配置,有兴趣的可以参考
https://docs.couchdb.org/en/stable/setup/cluster.html

3.3文档管理

CouchDB服务器托管命名数据库,用于存储文档。每个文档在数据库中都有唯一的名称,并且CouchDB提供RESTful HTTP API来读取和更新(添加,编辑,删除)数据库文档。

文档是CouchDB中数据的主要单位,由任意数量的字段和附件组成。文档还包括由数据库系统维护的元数据。文档字段具有唯一的名称,并且包含不同类型(文本,数字,布尔值,列表等)的值,并且对文本大小或元素数没有设置限制。

CouchDB文档更新模型是无锁且乐观的。客户端应用程序加载文档,应用更改并将其保存回数据库,从而对文档进行编辑。如果另一个编辑同一文档的客户端首先保存其更改,则该客户端在保存时会收到编辑冲突错误。要解决更新冲突,可以打开最新文档版本,重新应用编辑,然后再次尝试更新。

单个文档更新(添加,编辑,删除)全部成功或全部失败,或者全部失败或全部失败。数据库永远不会包含部分保存或编辑的文档。

好的,我们现在准备在couchdb中创建第一个文档(helloworld)

1、确认你的couchdb正常工作
确保CouchDB仍在运行,然后执行以下操作:
curl http://127.0.0.1:5984/
这会向新安装的CouchDB实例发出GET请求。

答复应类似于:

{
“couchdb”: “Welcome”,
“version”: “2.2.0”,
“git_sha”:“2a16ec4”,
“features”: [
“pluggable-storage-engines”,
“scheduler”
],
“vendor”: {
“name”: “The Apache Software Foundation”
}
}
2、获取数据库列表

curl -X GET http://127.0.0.1:5984/_all_dbs
couchdb入门指南1——环境搭建和简单的调试
如果返回的结果是一个空数组则说明你couchdb安装有问题
3、让我们创建一个数据库:

curl -X PUT http://127.0.0.1:5984/baseball
couchdb入门指南1——环境搭建和简单的调试
在执行这个命令时候你需要向数据库验证你的管理员权限
curl -X PUT http://admin:[email protected]:5984/baseball
couchdb入门指南1——环境搭建和简单的调试
在couchdb的页面中我们也发现自定义的数据库
couchdb入门指南1——环境搭建和简单的调试
删除数据库:
curl -X DELETE http://admin:[email protected]:5984/plankton

访问页面去配置数据库
http://127.0.0.1:5984/_utils/
输入你在单节点调试环节设置的账户和密码
couchdb入门指南1——环境搭建和简单的调试
由于都是页面化的功能设置这里不再详述

使用MapReduce运行查询
传统的关系数据库允许您运行所需的任何查询,只要您的数据结构正确即可。相比之下,CouchDB使用预定义的map并以称为MapReduce的样式来简化函数。这些功能提供了极大的灵活性,因为它们可以适应文档结构的变化,并且每个文档的索引都可以独立和并行地计算。映射和约简功能的组合在CouchDB术语中称为视图。

对于经验丰富的关系数据库程序员,MapReduce可以适应一些。减少查询不是基于声明哪个表的行包含在结果集中,而是根据数据库确定运行查询的最有效方法,而是根据简单的范围请求针对映射函数生成的索引,而不是声明数据库。

以每个文档为参数调用一次Map函数。该功能可以选择完全跳过文档,也可以发出一个或多个视图行作为键/值对。地图功能可能不依赖于文档之外的任何信息。这种独立性允许CouchDB视图以增量方式并行生成。

CouchDB视图存储为按键排序的行。即使有成千上万的行,这也使得从一系列键中检索数据变得高效。编写CouchDB映射函数时,您的主要目标是建立一个索引,该索引在附近的键下存储相关数据。

在运行示例MapReduce视图之前,我们需要一些数据才能对其运行。我们将创建包含不同商店中各种超市商品价格的文档。让我们为苹果,橙子和香蕉创建文档。(允许CouchDB生成_id和_rev字段。)使用Fauxton创建具有最终JSON结构的文档,如下所示:

{
“_id”: “00a271787f89c0ef2e10e88a0c0001f4”,
“_rev”: “1-2628a75ac8c3abfffc8f6e30c9949fd6”,
“item”: “apple”,
“prices”: {
“Fresh Mart”: 1.59,
“Price Max”: 5.99,
“Apples Express”: 0.79
}
}

好的,既然完成了,让我们为桔子创建文档:

{
“_id”: “00a271787f89c0ef2e10e88a0c0003f0”,
“_rev”: “1-e9680c5d9a688b4ff8dd68549e8e072c”,
“item”: “orange”,
“prices”: {
“Fresh Mart”: 1.99,
“Price Max”: 3.19,
“Citrus Circus”: 1.09
} }

最后,有关香蕉的文档:

{
“_id”: “00a271787f89c0ef2e10e88a0c00048b”,
“_rev”: “1-60e25d93dc12884676d037400a6fa189”,
“item”: “banana”,
“prices”: {
“Fresh Mart”: 1.99,
“Price Max”: 0.79,
“Banana Montana”: 4.22
} }

想象一下我们正在举办大型午餐会,但是客户对价格非常敏感。为了找到最低的价格,我们将创建第一个视图,该视图显示按价格排序的每种水果。单击“所有文档”以返回到Hello World概述,然后从“所有文档”加号中单击“新建视图”以创建一个新视图。

命名设计文档_design/myDesignDoc,并将索引名称设置为prices。

编辑右侧的地图函数,使其外观如下所示:
couchdb入门指南1——环境搭建和简单的调试
这是一个JavaScript函数,CouchDB在计算视图时为我们的每个文档运行。我们暂时将reduce函数留空。

单击“保存文档,然后构建索引”,您应该看到结果行,其中各个项目按价格排序。如果该地图功能按类型对项目进行分组,以使香蕉的所有价格在结果集中彼此相邻,则该地图功能可能会更加有用。CouchDB的**排序系统允许任何有效的JSON对象作为**。在这种情况下,我们将发出一个[item,price]数组,以便CouchDB按商品类型和价格分组。

数据库备份复制
首先,我们需要创建一个空数据库作为复制目标。返回数据库概述并创建一个名为的数据库 hello-replication。现在,单击侧栏中的“复制”,然后选择hello-world作为源,并选择hello-replication作为目标。单击“复制”以复制数据库。

要查看复制结果,请再次单击“数据库”选项卡。您应该看到hello-replication数据库的文档数量与hello-world数据库的文档数量相同,并且其大小也应大致相同。
couchdb入门指南1——环境搭建和简单的调试

couchdb入门指南1——环境搭建和简单的调试

使用curl后台操作couchdb
为数据库创建文档
curl -X PUT http://admin:[email protected]:5984/baseball/6e1295ed6c29495e54cc05947f18c8af -d “{“title”:“There is Nothing Left to Lose”,“artist”:“Foo Fighters”}”
couchdb入门指南1——环境搭建和简单的调试
更新数据库中文档
curl -X PUT http://admin:[email protected]:5984/baseball/6e1295ed6c29495e54cc05947f18c8af -d “{”_rev":“2-a0ecd0b4133f5d5824078835d510c231”,“title”:“There is Nothing Left to Lose”,“artist”:“Foo Fighters”,“year”:“1997”}"

2-a0ecd0b4133f5d5824078835d510c231中的2表示修改过一次,默认数据为1

现在您了解了为什么_rev在我们发出初始请求时CouchDB返回该信息很方便。CouchDB回复:

{“ok”:true,“id”:“6e1295ed6c29495e54cc05947f18c8af”,“rev”:“2-8aff9ee9d06671fa89c99d20a4b3ae”}
CouchDB接受了您的写入,并且还生成了一个新的修订号。修订号是文档传输表示的MD5哈希,其N-前缀表示文档更新的次数。这对于复制很有用。有关更多信息,请参见复制和冲突模型。

将非文档的资源作为附件挂载
curl -vX PUT http://admin:[email protected]:5984/baseball/6e1295ed6c29495e54cc05947f18c8af/artwork.jpg?rev=4-15388910bbb85c596c6c0a467a08eec1 --data-binary @“D:\ceshi\assets\metedata.JPG” -H “Content-Type:image/jpg”
couchdb入门指南1——环境搭建和简单的调试
其他命令参考
couchdb入门指南1——环境搭建和简单的调试