每个文档都是自包含的数据单元,是一系列数据项的集合。 每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。 每个文档都有一个全局惟一的标识符(ID)以及一个修订版本号(revision number)。

存储格式:JSON

字段解释

_id : 全局惟一的标识符,用来惟一标识一个文档; 
_rev : 修订版本号,用来实现多版本并发控制(Multiversion concurrency control,MVVC); 
_attachments : 内嵌型附件,以 base64 编码的格式作为文档的一个字段保存;

最简单的文档结构

文档中至少要包含_id和_rev字段,示例如下:

{
"_id": "5fecc0d7fe5acac6b46359b5eeefb614",
"_rev": "1-967a00dff5e02add41819138abb3284d"
}

couchDB设计文档

设计文档是一类特殊的文档,其ID必须以_design/开头。 设计文档的存在是使用CouchDB开发Web应用的基础。 在CouchDB中,一个Web应用是与一个设计文档相对应的。 
在设计文档中可以包含一些特殊的字段,其中包括:

views 包含永久的视图定义; 
shows 包含把文档转换成非JSON格式的方法; 
lists 包含把视图运行结果转换成非JSON格式的方法; 
validate_doc_update 包含验证文档更新是否有效的方法。

设计文档结构 :

{ "_id" : "_design/${docName}", "_rev" : "${revision}",

"language" : "javascript",

"views": {
...
} "shows": {
...
} "lists": {
...
} "_attachments": {
...
}

}

最简单的设计文档结构

{
"_id" : "_design/example",
"views" : {
"foo" : {
"map" : "function(doc){ emit(doc._id, doc._rev)}"
}
}
}

views字段

包含永久的视图定义。

具体参考文档:couchDB视图

shows字段

基本格式

{
"_id": "_design/examples",
"shows": {
"people": "function(doc, req) { /*...*/ }"
}
}

show方法

示例代码:

function(doc, req) {
return {
body: "Hello World"
}
}

每个show方法都可以有两个参数:doc和req 
其中doc表示的是与请求的文档ID对应的文档内容, 而req则表示与当前请求相关的内容,是一个JSON对象。该JSON对象参数如下:

body    对于 GET 请求来说,该属性的值是undefined;对于 POST/PUT 请求来说,该属性的值是请求的内容。
cookie 该属性表示浏览器端的 cookie 。
form 如果请求的内容类型(Content Type)是application/x-www-form-urlencoded的话,该属性包含解码之后的 JSON 对象。
info 该属性包含所请求的 CouchDB 数据库的信息。
path 该属性是一个数组,表示请求的路径。
query 该属性包含对请求的查询字符串解码之后的 JSON 对象。
verb 该属性表示 HTTP 请求的方法,一般是 GET/POST/PUT/DELETE 。

这里需要注意的是请求中的文档 ID 与 show 方法的参数doc的关系,具体的情况如下:

请求中传入了文档 ID,并且数据库中存在与此 ID 对应的文档:这种情况下,doc的值就是此 ID 对应的文档内容。 
请求中传入了文档 ID,但是数据库中没有与此 ID 对应的文档:这种情况下,doc的值是null,可以通过req.docId获取此 ID 。一般的行为是创建 ID 为req.docId的文档。 
请求中没有传入文档 ID:这种情况下,doc和req.docId的值都为null。一般的行为是由 CouchDB 生成一个 ID,并创建文档。

show方法都需要返回一个包含了 HTTP 响应信息的 JSON 对象。该 JSON 对象中可以包含以下几个字段:

code    该属性表示 HTTP 响应的状态代码,默认是 200 。
headers 该属性表示 HTTP 响应的头,是一个 JSON 对象,如{"Content-Type" : "application/xml"}。
json 设置该属性表示把一个 JSON 对象发送给客户端。
body 设置该属性表示把一个任意的字符串发送给客户端。
base64 设置该属性表示把 base64 编码的二进制数据发送给客户端。

表示 HTTP 响应内容的json、body和base64只需要设置一个即可。

访问语法

GET /db/_design/examples/_show/people/doc_id
GET /db/_design/examples/_show/people/doc_id?format=xml&details=true

lists字段

list方法用来把视图转换成非JSON格式。 由于视图的运行结果包含多行数据,list方法需要迭代每行数据并分别进行格式化,因此对于一个视图的运行结果,list 方法会被多次调用。 list方法的调用过程是迭代之前调用一次,对结果中的每行数据都调用一次,最后在迭代之后再调用一次。

基本格式

{
"_id": "_design/examples",
"views" {
"posts-by-date": {"map": "function(doc){ /*...*/ }"},
"posts-by-tag": {"map": "function(doc){ /*...*/ }"},
"people-by-name": {"map": "function(doc) { /*...*/ }"}
},
"lists": {
"index-posts": "function(head, req) { /*...*/ }",
"browse-people": "function(head, req) { /*...*/ }"
}
}

list方法

每个list方法都可以有两个参数:head、req

方法示例:

function(head, req) {
var row;
start({
"headers": {
"Content-Type": "text/html"
}
});
while(row = getRow()) {
send(row.value);
}
}

访问语法

GET /db/_design/examples/_list/index-posts/posts-by-date?descending=true&limit=10
GET /db/_design/examples/_list/index-posts/posts-by-tag?key="howto"
GET /db/_design/examples/_list/browse-people/people-by-name?startkey=["a"]&limit=10

示例代码

文档代码:

{
"_id": "_design/example",
"views": {
"foo": {
"map": "function(doc){ emit(doc._id, doc._rev)}"
}
},
"lists": {
"index-posts": "function(head, req) {var row; start({\"headers\": {\"Content-Type\": \"text/html\"}});while(row = getRow()) {send(row.value);}}"
}
} curl代码: curl "http://127.0.0.1:5984/testdb2/_design/example/_list/index-posts/foo"

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2014/20141007_couchDB文档.md

欢迎补充

couchDB文档的更多相关文章

  1. NoSQL生态系统——类似Bigtable列存储,或者Dynamo的key存储(kv存储如BDB,结构化存储如redis,文档存储如mongoDB)

    摘自:http://www.ituring.com.cn/article/4002# NoSQL系统的数据操作接口应该是非SQL类型的.但在NoSQL社区,NoSQL被赋予了更具有包容性的含义,其意为 ...

  2. MongoDB,无模式文档型数据库简介

    MongoDB的名字源自一个形容词humongous(巨大无比的),在向上扩展和快速处理大数据量方面,它会损失一些精度,在旧金山举行的MondoDB大会上,Merriman说:“你不适宜用它来处理复杂 ...

  3. Tokyocabinet/Tokyotyrant文档大合集

    1. 前言 这里不是我个人原创,是我对网络上整理到的资料的再加工,以更成体系,更方便研究阅读.主要是对其中跟主题无关的文字删除,部分人称稍做修改;本人无版权,您可以将本页面视为对参考页面的镜像.第二部 ...

  4. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  5. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  6. ABP文档 - Javascript Api - AJAX

    本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...

  7. ABP文档 - EntityFramework 集成

    文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...

  8. ABP文档 - SignalR 集成

    文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...

  9. ABP文档 - 通知系统

    文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...

随机推荐

  1. Android随笔之——Activity中启动另一应用

    最近在写语音交互程序,在语音打开应用这块碰到如何用代码控制应用启动的问题.百度了一下,有两种方案:1.获取应用的包名:2.获取应用的包名.入口类名. 之前对两种方案都进行了尝试,发现方案二中存在一个弊 ...

  2. 如何利用Oracle外部表导入文本文件的数据

    同事最近在忙数据一致性比对工作,需要对不同文本文件中的数据进行比对,有的文件较大,记录较多,如果用普通的文本编辑器打开的话,很显然,会很卡,甚至打不开. 基于此,可将该文本文件的数据导入到数据库中,在 ...

  3. T-Sql(六)触发器(trigger)

    不知不觉讲到触发器了,一般我们做程序的很少接触到触发器,触发器的操作一般是DB人员来完成. 然而有的时候一些简单的业务需要我们自己去完成,不能每次都去麻烦DB人员,所以说,编程人员要全才,除了编程以为 ...

  4. 关于 android 的 view.getLeft(), getRight(), getTop(), getBottom() 的一些疑惑(坑)解答

    (原创) 今天在做下滑刷新的时候碰到 view 的四个 get 函数有点特别,具体遇到的问题如下,经反复测试和查找资料,填坑如下: 1,为什么我有时候在使用getLeft(), getRight(), ...

  5. PHP+ajaxfileupload与jcrop插件结合 完成头像上传

    昨天花了点时间整合了一下头像插件 东拼西凑的成果 先来看下效果

  6. 分享一个UI与业务逻辑分层的框架(二)

    序言 第一篇讲解了UI与业务逻辑分层的框架(UIMediator)的使用.本篇将说明该框架的原理及代码实现. 整体结构 UI与后台类绑定主要分为UI输入->后台属性,后台属性-UI更新两部分,为 ...

  7. Redis Cluster原理

    Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写. ...

  8. C#正则表达式Regex常用匹配

    使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现验证 示例1:注释的代码所起的作用是相同的,不过一个是静态方法,一个是 ...

  9. jquery.uploadify上传文件配置详解(asp.net mvc)

    页面源码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  10. 渡轮问题Ship

    题目描述 Palmia河从东往西流过Palmia国,把整个国家分成南北两半.河的两岸各有N个城市,北岸的每一个城市都与南岸的一个城市互为友好城市,而且任意两个北岸城市的友好城市都不相同.每一对友好城市 ...