每一個文檔都是自包含的數據單元,是一系列數據項的集合。 每一個數據項都有一個名稱與對應的值,值既能夠是簡單的數據類型,如字符串、數字和日期等;也能夠是複雜的類型,若有序列表和關聯對象。 每一個文檔都有一個全局唯一的標識符(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"