couchDB文檔

每一個文檔都是自包含的數據單元,是一系列數據項的集合。 每一個數據項都有一個名稱與對應的值,值既能夠是簡單的數據類型,如字符串、數字和日期等;也能夠是複雜的類型,若有序列表和關聯對象。 每一個文檔都有一個全局唯一的標識符(ID)以及一個修訂版本號(revision number)。javascript

存儲格式:JSONhtml

字段解釋java

_id : 全局唯一的標識符,用來唯一標識一個文檔; 
_rev : 修訂版本號,用來實現多版本併發控制(Multiversion concurrency control,MVVC); 
_attachments : 內嵌型附件,以 base64 編碼的格式做爲文檔的一個字段保存;數據庫

最簡單的文檔結構

文檔中至少要包含_id和_rev字段,示例以下:json

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

couchDB設計文檔

設計文檔是一類特殊的文檔,其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)}"
        }
    }
}

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"
相關文章
相關標籤/搜索