Пример работы с view в CouchDB

Вместо индексов в CouchDB используется map/reduce.
Часто хватает создания одной только map-функции вида

function(doc) {
  emit(key, value);
}

После чего в индексный файл помещаются все пары ключ-значение (из базы данных, к которой привязана map-функция), упорядоченные по ключу.

Пример использования map-функций.
Для начала надо создать базу данных с документами.
На главной странице Futon’а нажимаем на «create database» — создаём базу «modules». Дальше в этой базе «create document» — создаём документы:

{_id: "compas1_mod0", _rev: "2-4271250713", cid: "compas1", pos: 0, data: "ser_1_0"},
{_id: "compas1_mod1", _rev: "2-2506425121", cid: "compas1", pos: 1, data: "ser_1_1"},
{_id: "compas1_mod2", _rev: "2-2782315297", cid: "compas1", pos: 2, data: "ser_1_2"} и
{_id: "compas2_mod0", _rev: "2-3025733035", cid: "compas2", pos: 0, data: "ser_2_0"}.

*при внесении текстового поля его надо брать в кавычки

Затем в селекте справа выбираем «temporary view».
Создаём первый view.
В поле «Map Function:»:

function(doc) {
  emit(doc.cid, doc);
}

и сохраняем («save as») с параметрами
Design Document — modules_views
View Name — compas_modules.

Создаём второй view.
В поле «Map Function:»:

function(doc) {
  emit([doc.cid, doc.pos], doc);
}

и сохраняем («save as») с параметрами
Design Document — modules_views
View Name — one_module.

После чего в браузере можно набрать
http://localhost:5984/modules/_design/modules_views/_view/compas_modules?key=»compas1″ — выдаст

{"total_rows":4,"offset":0,"rows":[
{"id":"compas1_mod0","key":"compas1","value":{"_id":"compas1_mod0","_rev":"2-4271250713","cid":"compas1","pos":0,"data":"ser_1_0"}},
{"id":"compas1_mod1","key":"compas1","value":{"_id":"compas1_mod1","_rev":"2-2506425121","cid":"compas1","pos":1,"data":"ser_1_1"}},
{"id":"compas1_mod2","key":"compas1","value":{"_id":"compas1_mod2","_rev":"2-2782315297","cid":"compas1","pos":2,"data":"ser_1_2"}}
]}

а если набрать
http://localhost:5984/modules/_design/modules/_view/one_module?key=[«compas1»,0] — выдаст

{"total_rows":4,"offset":0,"rows":[
{"id":"compas1_mod0","key":["compas1",0],"value":{"_id":"compas1_mod0","_rev":"2-4271250713","cid":"compas1","pos":0,"data":"ser_1_0"}}
]}

Вообще-то надо обязательно проверять каждый раз, присутствует ли указанное свойство у документа,
т.е. вместо

function(doc) {
  emit([doc.cid, doc.pos], doc);
}

желательно писать

function(doc) {
  if (doc.cid && doc.pos)
  {
    emit([doc.cid, doc.pos], doc);
  }
}

т.к. при регулярных возникновениях ошибок при использовании map-функции (что может случиться, если свойства нет) CouchDB запрещает любое индексирование, чтобы прекратить дальнейшее использование ресурсов.

2 комментария so far.

LEAVE A COMMENT