backend/DataBase

[CouchDB] HTTP view API

버리야 2009. 9. 29. 09:50
반응형
CouchDB wiki에 있는 내용을 보고 정리한 내용입니다. 
제가 하고싶은걸 실습한 것이기 때문에 삭제된 내용도 있습니다.


view(뷰)는 Couch document를 쿼리하거나 리포팅할때 사용되는 주요툴이다.
뷰는 자바스크립트 function으로 정의된다.
function(doc) {
  emit(null, doc);
}

Creating Views
permanent view를 만들기 위해 function은 특별한 design document에 먼저 저장되어 있어야 한다.
design document의 id는 _design으로 시작하고 view attribute는 map과 optional하게 reduce를 갖는다.
design document의 모든 view는 index되어 있다.

design document
{
  "_id":"_design/company",
  "_rev":"12345",
  "language": "javascript",
  "views":
  {
    "all": {
      "map": "function(doc) { if (doc.Type == 'customer')  emit(null, doc) }"
    },
    "by_lastname": {
      "map": "function(doc) { if (doc.Type == 'customer')  emit(doc.LastName, doc) }"
    },
    "total_purchases": {
      "map": "function(doc) { if (doc.Type == 'purchase')  emit(doc.Customer, doc.Amount) }",
      "reduce": "function(keys, values) { return sum(values) }"
    }
  }
}


Altering/Changing Views

하나의 뷰나 여러개의 뷰들을 바구기 위해선 document바꿀때랑 똑같다.

Access/Query
database에 document가 한번 저장되어있으면 모든 view는 이 URL로 반환받을 수 있다.
http://localhost:5984/database/_design/company/_view/all

요청은 이렇게..
GET /some_database/_design/company/_view/all HTTP/1.0
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT

응답은 다음과 같다.
HTTP/1.1 200 OK
 Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
 Content-Length: 318
 Connection: close

 {
    "total_rows": 3,
    "offset": 0,
    "rows": [{
        "id":"64ACF01B05F53ACFEC48C062A5D01D89",
        "key": null,
        "value": {
          "LastName":"Katz",
          "FirstName":"Damien",
          "Address":"2407 Sawyer drive, Charlotte NC",
          "Phone":012555754211
        }
      }, {
        "id":"5D01D8964ACF01B05F53ACFEC48C062A",
        "key": null,
        "value": {
          "LastName":"Kerr",
          "FirstName":"Wayne",
          "Address":"123 Fake st., such and such",
          "Phone":88721320939
        }
      }, {
        "id":"EC48C062A5D01D8964ACF01B05F53ACF",
        "key": null,
        "value":
        {
          "LastName":"McCracken",
          "FirstName":"Phil",
          "Address":"1234 Fake st., such and such",
          "Phone":7766552342
        }
      }
    ]
 }


Temporary Views
한번 쿼리 날리고 말것(CouchDB database에 view를 저장하고 싶지않으면) _temp_view라는 특별한 view를 통해 할 수 있다.
Temporary View는 개발중에만 사용하는 것이 좋다.

요청
POST /some_database/_temp_view  HTTP/1.0
Content-Length: 48
Date: Mon, 10 Sep 2007 17:11:10 +0200
Content-Type: application/json

{
  "map" : "function(doc) { if (doc.foo=='bar') { emit(null, doc.foo); } }"
}

응답
{
  "total_rows": 1,
  "offset": 0,
  "rows": [{
      "id": "AE1AD84316B903AD46EF396CAFE8E50F",
      "key": null,
      "foo": "bar"
    }
  ]
}

NOTE : CouchDB 0.9.0에선 _temp_view에 POST 요청시 Content-Type: application/json를 써줘야한다.

Querying Options

아래와 같은 URL query arguments가 허용된다.

    * GET
            key=keyvalue

            startkey=keyvalue

            startkey_docid=docid

            endkey=keyvalue

            endkey_docid=docid

            limit=max rows to return This used to be called "count" previous to Trunk SVN r731159

            stale=ok

            descending=true

            skip=number of rows to skip

            group=true Version 0.8.0 and forward

            group_level=int

            reduce=false Trunk only (0.9)

            include_docs=true Trunk only (0.9)
           
    *  POST

            {"keys": ["key1", "key2", ...]} Trunk only (0.9)
           

반응형