CouchDB

Материал из First-Leon
Перейти к навигации Перейти к поиску

Установка

Ubuntu 12.04:

add-apt-repository ppa:nilya/couchdb-1.3
apt-get update
apt-get install couchdb

Версии свежее чем 1.3 на Ubuntu 12.04 не поставить так как слишком старый Erlang.

Разное

Запрос документа

curl -X GET http://localhost:5984/test19/id

Создание views

Пример создания двух view, выбирающих документы с конфликтами и документы с полем type=task:

{
  "_id":"_design/tasks",
  "language": "javascript",
  "views":
  {
     "all": {
         "map": "function(doc) { if (doc.type == 'task')  emit(null, doc) }"
     },
     "conflicts": {
         "map": "function(doc) { if (doc._conflicts) emit(doc._conflicts, null) }"
     }
  }
}
http://wiki.apache.org/couchdb/HTTP_view_API

Запрос списка конфликтов

curl -X GET http://localhost:5984/test19/_design/tasks/_view/conflicts

Удаление документа с заданной ревизией (актуально для конфликта)

curl -X DELETE http://localhost:5984/test19/id?rev=revision

Запуск репликации

curl -X POST http://127.0.0.1:5984/_replicate \
-d '{"source":"test13", "target":"http://user:password@foo.ru:5984/test13", "continuous":true}' -H "Content-Type: application/json"

Отслеживание изменений

curl -X GET "http://localhost:5984/test19/_changes?feed=continuous&since=1"

Создание фильтра

Пример фильтра, пропускающего только документы с конфликтами:

{
   "_id": "_design/app",
   "filters": {
       "conflicts": "function(doc, req) { if ( doc._conflicts ) { return true; } else { return false; } } "
   }
}

Отслеживание изменений с фильтром

curl -X GET "http://localhost:5984/test19/_changes?filter=app/conflicts&feed=continuous&since=1"

Включение Erlang query server

Разрешает создавать функции на языке Erlang. В файле /etc/couchdb/local.ini добавить:

[native_query_servers]
erlang = {couch_native_process, start_link, []}

Проверка документа (validate_doc_update)

Если размер базы больше заданного, то запрещаем создавать документ:

{
   "_id": "_design/validation",
   "language": "erlang",
   "validate_doc_update": "fun(NewDoc, OldDoc, {UserCtx}, SecObj) ->
                             DbName = couch_util:get_value(<<"db">>, UserCtx),
                             {ok, Db} = couch_db:open_int(DbName, [{user_ctx, UserCtx}]),
                             {ok, Info} = couch_db:get_db_info(Db),
                             DiskSize = couch_util:get_value(data_size, Info),
                             case DiskSize < 100000 of  %% ~100KB
                             true ->
                               ok;
                             false ->
                               case OldDoc of
                               null -> 
                                 throw({[{<<"forbidden">>, <<"quota limit reached">>}]});
                                 _ -> 1
                               end
                             end,
                             1
                           end."
}

Работает в CouchDB 1.3, 1.5. В 1.4 не работает и в следующих версиях работа не гарантируется


Глава в "CouchDB: The Definitive Guide"

Описание функции

Описание в официальной wiki

Использование даты

Проверка размера вложения пока невозможна

Вызов внешней библиотеки

Примеры функций на Erlang

Примеры функций на Erlang (официальная wiki)

еще пример нативной функции

Литература