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"}
本文github地址:
https://github.com/mike-zhang/mikeBlogEssays/blob/master/2014/20141007_couchDb简介.md
欢迎补充
CouchDB简介的更多相关文章
- 什么是CouchDB?
※本文对CouchDB的解释是来自Apache CouchDB的官网的译文,如果有什么问题,请指正. 1.CouchDB简介 CouchDB是一种利用JSON文件,javascript作为MapRed ...
- Couchdb 垂直权限绕过漏洞(CVE-2017-12635)漏洞复现
couchdb简介: Apache CouchDB是一个开源的NoSQL数据库,专注于易用性和成为“完全拥抱web的数据库”.它是一个使用JSON作为数据存储格式,javascript作为查询语言,M ...
- ApacheCN PHP 译文集 20211101 更新
PHP 入门指南 零.序言 一.PHP 入门 二.数组和循环 三.函数和类 四.数据操作 五.构建 PHP Web 应用 六.搭建 PHP 框架 七.认证与用户管理 八.建立联系人管理系统 使用 PH ...
- 1.NoSql简介
NoSQL,指的是非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以 ...
- Redis教程(一):Redis简介
转自:http://www.jb51.net/article/65240.htm 一.简介: 在过去的几年中,NoSQL数据库一度成为高并发.海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春 ...
- NoSQL和Redis简介及Redis在Windows下的安装和使用教程
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/103.html?1455869099 NoSQL简介 介绍redis前,我 ...
- mongodb(一) NoSQL简介
NoSQL简介 写在前面,本文就是学习的记录笔记,大部分内容都属于参考,分享给大家 关系与非关系数据库 那么应该了解下影响关系数据库性能的主要原因: 在关系型数据库中,导致性能欠佳的最主 ...
- Redis简介与简单安装
Redis简介与简单安装 一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类 ...
- CouchDB 简单HTTP接口使用说明
目录 1.简介 2.安装 2.HTTP接口简单使用 2.1.认证接口 2.1.1 Basic Authentication 2.1.2 Cookie Authentication 2.2 创建与删除数 ...
随机推荐
- 关于 android 的 view.getLeft(), getRight(), getTop(), getBottom() 的一些疑惑(坑)解答
(原创) 今天在做下滑刷新的时候碰到 view 的四个 get 函数有点特别,具体遇到的问题如下,经反复测试和查找资料,填坑如下: 1,为什么我有时候在使用getLeft(), getRight(), ...
- Java 枚举用法详解
概念 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum 关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, GR ...
- 【Android】Fragment懒加载和ViewPager的坑
效果 老规矩,先来看看效果 ANDROID和福利两个Fragment是设置的Fragment可见时加载数据,也就是懒加载.圆形的旋转加载图标只有一个,所以,如果当前Fragment正处于加载状态,在离 ...
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...
- 使用VS Code开发 调试.NET Core 应用程序
使用VS Code开发 调试.NET Core RC2应用程序,由于.NET Core 目前还处于预览版. 本文使用微软提供的示例进行开发及调试. https://github.com/aspnet/ ...
- canvas孙悟空脚踩白云今年是猴年
效果查看:http://hovertree.com/texiao/html5/30/ 使用HTML5的canvas画的孙悟空,CSS3画的白云飘飘. 刚擒住了几个妖 又降住了几个魔 魑魅魍魉怎么他就这 ...
- Redis 详解 (一) StackExchange.Redis Client
这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓存或者消息代理服务.目前有不少人在使用ServiceS ...
- autocad2008+C#2008开发中设置自动加载dll
一.复制编译后的dlll路径,比如我的是D:\zjy\cad开发\学习\宗地图\bin\Debug\zd.dll 二.随便找个地方新建一个记事本,在记事本中写入以下内容: (command " ...
- Android Studio实现APK的更新、下载、安装
先不讲那么多看效果图: 下面来讲解一些更新CODE,原理大家都知道,不废话,直接上代码.里面有一些是我自己做的测试例子,所以大家可以直接删掉就好了 第一个:activity_main.xml < ...
- php语言实现的7种基本的排序方法
今天总结了一下常用的7种排序方法,并用php语言实现. 直接插入排序 /* * 直接插入排序,插入排序的思想是:当前插入位置之前的元素有序, * 若插入当前位置的元素比有序元素最后一个元素大,则什么也 ...