CouchDB简介

类型:开源数据库,Apache项目 
存储格式:JSON 
查询语言:JavaScript 
API :MapReduce、HTTP

特点

  • MVCC(Multiversion concurrency control)

    CouchDB一个支持多版本控制的系统,此类系统通常支持多个结点写, 而系统会检测到多个系统的写操作之间的冲突并以一定的算法规则予以解决。

  • 水平扩展性

    在扩展性方面,CouchDB使用replication去做。 
    CouchDB的设计基于支持双向的复制(同步)和离线操作。 这意味着多个复制能够对同一数据有其自己的拷贝,可以进行修改,之后将这些变更进行同步。

  • REST API(Representational State Transfer,简称REST,表述性状态转移)

    所有的数据都有一个唯一的通过HTTP暴露出来的URI。 
    REST使用HTTP方法 POST,GET,PUT和DELETE来操作对应的四个基本 CRUD(Create,Read,Update,Delete)操作来操作所有的资源。

  • 数据查询操作

    CouchDB不支持动态查询,你必须为你的每一个查询模式建立相应的视图,并在此视图的基础上进行查询。 
    视图是CouchDB中文档的呈现方式,在CouchDB 中保存的是视图的定义。 
    CouchDB 中有两种视图:永久视图和临时视图。 永久视图保存在设计文档的views字段中。 如果需要修改永久视图的定义,只需要通过文档 REST API 来修改设计文档即可。 临时视图是通过发送 POST 请求到 URL/dbName/_temp_view 来执行的。在POST请求中需要包含视图的定义。 一般来说,临时视图只在开发测试中使用,因为它是即时生成的,性能比较差; 永久视图的运行结果可以被 CouchDB 缓存,因此一般用在生产环境中。

  • 原子性

    支持针对行的原子性修改(concurrent modifications of single documents),但不支持更多的复杂事务操作。

  • 数据可靠性

    CouchDB是一个”crash-only”的系统,你可以在任何时候停掉CouchDB并能保证数据的一致性。

  • 最终一致性

    CouchDB保证最终一致性,使其能够同时提供可用性和分割容忍。

  • 离线支持

    CoucbDB能够同步复制到可能会离线的终端设备(比如智能手机),同时当设置再次在线时处理数据同步。 CouchDB内置了一个的叫做Futon的通过web访问的管理接口。

与SQL语法比较

查询数据库列表

mysql

通过show查询,示例如下:

show databases;

返回结果:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+

couchDB

通过GET请求访问URL/_all_dbs可以获取数据库列表。 
示例如下:

curl -X GET http://127.0.0.1:5984/_all_dbs

返回结果:
["_replicator","_users","db1","db2"]

创建数据库

mysql

通过create语句实现,示例如下:

create database testdb;

couchDB

通过PUT请求访问URL/dbName可以创建名称为dbName的数据库。 
示例如下:

curl -X PUT http://127.0.0.1:5984/testdb

返回结果:
{"ok":true}

添加表

mysql

通过create语句实现,示例如下:

create table tb1(
    id int,
    name varchar(20)
);

couchDB

没有表的概念,数据直接以文档的形式存储在数据库中,每个数据库是一个独立的文档集合。

添加数据

mysql

通过insert语句实现,示例如下:

insert into tb1 (id,name) values (1,‘mike‘);

couchDB

通过PUT请求访问 URL/dbName/doc_id 可以在名称为dbName的数据库中创建ID为doc_id的文档。 
通过POST请求访问 URL/dbName/ 也可以创建新文档,不过是由 CouchDB 来生成文档的ID。

比如通过PUT方法添加uuid为1925a2a284289df9b55b390525001ca1文档到数据库:

curl -X PUT http://127.0.0.1:5984/testdb/1925a2a284289df9b55b390525001ca1 -d ‘{"id":1,"name":"mike"}‘

返回结果:
{"ok":true,"id":"1925a2a284289df9b55b390525001ca1","rev":"1-0c1f72feabb29905ed205d25fbcbf3b3"}

查询数据

mysql

1、单条数据查询

通过select语句实现,示例代码:

select * from tb1 where id =1;

查询结果:
+------+------+
| id   | name |
+------+------+
|    1 | Mike |
+------+------+

2、多条数据查询 
通过select语句实现,示例代码:

select * from tb1 where id > 1;

查询结果:
+------+------+
| id   | name |
+------+------+
|    2 | mike |
|    3 | mike |
+------+------+

3、查询该表所有数据

通过select语句实现,示例代码: 
select * from tb1;

查询结果:
+------+------+
| id   | name |
+------+------+
|    1 | Mike |
|    2 | mike |
|    3 | mike |
+------+------+

couchDB

1、单条数据查询

通过GET请求访问 URL/dbName/doc_id 可以获取名称为dbName的数据库中ID为doc_id文档的内容。 
文档的内容是一个JSON对象,其中以“ _ ”作为前缀的顶层字段是由CouchDB保留使用的,如_id和_rev。

示例如下:

curl -X GET http://127.0.0.1:5984/testdb/1925a2a284289df9b55b390525001ca1

返回结果:
{"_id":"1925a2a284289df9b55b390525001ca1","_rev":"2-1b70c2faffc36cde06f29f16580ae668","name":"Mike"}

2、多条数据查询

couchDB通过视图进行查询。 
示例如下:

创建视图:
{
   "_id": "_design/example",
   "language": "javascript",
   "views": {
       "getdata": {
            "map": "function(doc){ if(doc.id>1){emit(doc.id, doc.name)}}"
       }
   }
}

执行查询:
curl  -X GET http://127.0.0.1:5984/testdb/_design/example/_view/getdata

返回结果:
{"total_rows":2,"offset":0,"rows":[
{"id":"25e1a898ee71465309b209d8e9036a73","key":2,"value":"mike"},
{"id":"25e1a898ee71465309b209d8e9037a05","key":3,"value":"mike"}
]}

3、查询所有文档

方法一:

通过视图进行查询。 
示例如下:

创建视图:
{
   "_id": "_design/example",
   "language": "javascript",
   "views": {
       "getall": {
            "map": "function(doc){ emit(doc.id, doc.name)}"
       }
   }
}

执行查询:
curl  -X GET http://127.0.0.1:5984/testdb/_design/example/_view/getall

返回结果:
{"total_rows":3,"offset":0,"rows":[
{"id":"1925a2a284289df9b55b390525001ca1","key":1,"value":"mike"},
{"id":"25e1a898ee71465309b209d8e9036a73","key":2,"value":"mike"},
{"id":"25e1a898ee71465309b209d8e9037a05","key":3,"value":"mike"}
]}

方法二:

couchDB没有表的概念,可以通过GET请求访问 URL/dbName/_all_docs 查询某个库中的所有文档。 
该命令也只能列出该数据库中所有的key列表,具体数据的查询需要重新进行GET操作。

示例如下:

curl -X GET http://172.16.10.2:5984/testdb/_all_docs

返回结果:
{"total_rows":2,"offset":0,"rows":[
{"id":"1925a2a284289df9b55b390525001ca1","key":"1925a2a284289df9b55b390525001ca1","value":{"rev":"2-1b70c2faffc36cde06f29f16580ae668"}},
{"id":"dae18eb4f907f706d92666223d003c94","key":"dae18eb4f907f706d92666223d003c94","value":{"rev":"1-967a00dff5e02add41819138abb3284d"}}
]}

curl -X GET http://127.0.0.1:5984/testdb/1925a2a284289df9b55b390525001ca1
curl -X GET http://127.0.0.1:5984/testdb/dae18eb4f907f706d92666223d003c94

修改数据

mysql

通过update语句实现,示例如下:

update tb1 set name=‘Mike‘  where id = 1;

couchDB

通过PUT请求访问 URL/dbName/doc_id 可以更新已有的文档。 
在PUT请求内容的文档中需要包含_rev字段,表示文档的修订版本号。 
CouchDB使用该字段来做更新时的冲突检测。 
如果该字段的值与 CouchDB 中保存的该文档的修订版本号一致,则表明没有冲突,可以进行更新。 
当更新完成之后,返回 HTTP 状态代码 201 ; 
否则返回 HTTP 状态代码 409,表示有版本冲突。

比如更新uuid为1925a2a284289df9b55b390525001ca1文档:

curl -X PUT http://127.0.0.1:5984/testdb/1925a2a284289df9b55b390525001ca1 -d ‘{"_rev":"1-0c1f72feabb29905ed205d25fbcbf3b3","id":1,"name":"Mike"}‘

返回结果:
{"ok":true,"id":"1925a2a284289df9b55b390525001ca1","rev":"2-dd2a105c56897b5b55cb1fa15331071a"}

删除数据

mysql

通过delete语句实现,示例如下:

delete from tb1 where id = 1;

couchDB

通过DELETE请求访问 URL/dbName/doc_id?rev=rev_id可以删除数据库databasename中 ID 为doc_id,并且修订版本号为rev_id的文档。

示例如下:

curl -X DELETE http://127.0.0.1:5984/testdb/1925a2a284289df9b55b390525001ca1?rev=2-dd2a105c56897b5b55cb1fa15331071a

返回结果:
{"ok":true,"id":"1925a2a284289df9b55b390525001ca1","rev":"3-aa8b9d239a4a42e78483dc1d6f424f71"}
时间: 2024-07-28 14:15:04

CouchDB简介的相关文章

开源大数据处理系统/工具大全

本文一共分为上下两部分.我们将针对大数据开源工具不同的用处来进行分类,并且附上了官网和部分下载链接,希望能给做大数据的朋友做个参考.下面是第一部分. 查询引擎 一.Phoenix 贡献者::Salesforce 简介:这是一个Java中间层,可以让开发者在Apache HBase上执行SQL查询.Phoenix完全使用Java编写,代码位于GitHub上,并且提供了一个客户端可嵌入的JDBC驱动. Phoenix查询引擎会将SQL查询转换为一个或多个HBase scan,并编排执行以生成标准的J

大数据工具集详

查询引擎 一.Phoenix 贡献者::Salesforce 简介:这是一个Java中间层,可以让开发者在Apache HBase上执行SQL查询.Phoenix完全使用Java编写,代码位于GitHub上,并且提供了一个客户端可嵌入的JDBC驱动. Phoenix查询引擎会将SQL查询转换为一个或多个HBase scan,并编排执行以生成标准的JDBC结果集.直接使用HBase API.协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒. Ph

[转载] 一共81个,开源大数据处理工具汇总(上)

原文: http://www.36dsj.com/archives/24852 本文一共分为上下两部分.我们将针对大数据开源工具不同的用处来进行分类,并且附上了官网和部分下载链接,希望能给做大数据的朋友做个参考.下面是第一部分. 查询引擎 一.Phoenix 贡献者::Salesforce 简介:这是一个Java中间层,可以让开发者在Apache HBase上执行SQL查询.Phoenix完全使用Java编写,代码位于GitHub上,并且提供了一个客户端可嵌入的JDBC驱动. Phoenix查询

NoSQL数据库简介

一.简介 NoSQL(Not Only SQL),泛指非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展.NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题. 虽然NoSQL流行语火起来才短短一年的时间,但是不可否认,现在已经开始了第二代运动.尽管早期的堆栈

分布式系统及NoSQLl简介

分布式系统及NoSQL简介 ============================================================================== 数据存储  1.数据存储 ★数据模型: 层次模型: 网状模型: 关系模型: 对象关系模型 ☉关系模型: 关系型数据,严格的schema: ACID规则 分布式系统  1.介绍 ★分布式系统: 分布式系统(distributed system)由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成.

couchdb

couchdb CouchDB是用Erlang开发的面向文档的数据库系统,CouchDB一种半结构化面向文档的分布式,高容错的数据库系统,其提供RESTFul HTTP/JSON接口,所以它一直倍受用户的青睐. 目录 1简介 2特性 应用场景 特色 3实现 4结构 5ACID 6View Server View Model JavaScript 1简介 CouchDB是用Erlang开发的面向文档的数据库系统,最近刚刚发布了1.0版本.CouchDB不是一个传统的关系数据库,而是面向文档的数据库

自学总结redis第一部分(简介、虚拟机配置、安装、配置、连接方式、密码设置)

Redis学习部分 一.NoSql简介 NoSql泛指非关系型数据库. 更多简介请见 "http://baike.baidu.com/link?url=sYV3qpYWs3RDlz1RZbVP18luQwubYrboLUt2qRDhSJrhctvLL1tYBtDFf736ypSocpnmZE5eLvyYzd34k5T2xa" 1.1NoSql数据库的四大分类 键值(key-value)存储数据库:这一类数据库主要会使用一个哈希表,这个表中有一个特定的键和一个指针执行特定的数据.Key/

js简介引生出来的范式学习

看到js的简介有这么一句话: JavaScript® (JS) 是一门轻量的.解释型的.将函数视为一级公民的程序设计语言,它是最为出名的网页脚本语言,但也在很多非网页环境中运用,例如 node.js 和 Apache CouchDB.它是一种基于原型的.多范式的动态脚本语言,并且支持面向对象.命令式编程风格和函数式编程风格. 读不懂了,这里的多范式 范式是什么了? 那就要学习下这个概念了! 一.范式是一种编程风格.多范式就是多种编程风格. 编程范式是程序语言背后的思想.代表了程序语言的设计者认为

NoSQL初探之人人都爱Redis:(1)Redis简介与简单安装

一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题: (1)对数据库高并发读写的需求 网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求.关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求