每一个文档都是自包含的数据单元,是一系列数据项的集合。 每一个数据项都有一个名称与对应的值,值既能够是简单的数据类型,如字符串、数字和日期等;也能够是复杂的类型,若有序列表和关联对象。 每一个文档都有一个全局唯一的标识符(ID)以及一个修订版本号(revision number)。javascript
存储格式:JSONhtml
字段解释java
_id : 全局唯一的标识符,用来唯一标识一个文档;
_rev : 修订版本号,用来实现多版本并发控制(Multiversion concurrency control,MVVC);
_attachments : 内嵌型附件,以 base64 编码的格式做为文档的一个字段保存;数据库
文档中至少要包含_id和_rev字段,示例以下:json
{ "_id": "5fecc0d7fe5acac6b46359b5eeefb614", "_rev": "1-967a00dff5e02add41819138abb3284d" }
设计文档是一类特殊的文档,其ID必须以_design/开头。 设计文档的存在是使用CouchDB开发Web应用的基础。 在CouchDB中,一个Web应用是与一个设计文档相对应的。
在设计文档中能够包含一些特殊的字段,其中包括:数组
views 包含永久的视图定义;
shows 包含把文档转换成非JSON格式的方法;
lists 包含把视图运行结果转换成非JSON格式的方法;
validate_doc_update 包含验证文档更新是否有效的方法。浏览器
设计文档结构 :cookie
{ "_id" : "_design/${docName}", "_rev" : "${revision}",并发
"language" : "javascript", "views": { ... } "shows": { ... } "lists": { ... } "_attachments": { ... }
}app
{ "_id" : "_design/example", "views" : { "foo" : { "map" : "function(doc){ emit(doc._id, doc._rev)}" } } }
包含永久的视图定义。
具体参考文档:couchDB视图
{ "_id": "_design/examples", "shows": { "people": "function(doc, req) { /*...*/ }" } }
示例代码:
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
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方法均可以有两个参数: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"