Пример работы с view в CouchDB
Вместо индексов в CouchDB используется map/reduce.
Часто хватает создания одной только map-функции вида
1 2 3 |
function(doc) { emit(key, value); } |
После чего в индексный файл помещаются все пары ключ-значение (из базы данных, к которой привязана map-функция), упорядоченные по ключу.
Пример использования map-функций.
Для начала надо создать базу данных с документами.
На главной странице Futon’а нажимаем на «create database» — создаём базу «modules». Дальше в этой базе «create document» — создаём документы:
1 2 3 4 |
{_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:»:
1 2 3 |
function(doc) { emit(doc.cid, doc); } |
и сохраняем («save as») с параметрами
Design Document — modules_views
View Name — compas_modules.
Создаём второй view.
В поле «Map Function:»:
1 2 3 |
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″ — выдаст
1 2 3 4 5 |
{"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] — выдаст
1 2 3 |
{"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"}} ]} |
Вообще-то надо обязательно проверять каждый раз, присутствует ли указанное свойство у документа,
т.е. вместо
1 2 3 |
function(doc) { emit([doc.cid, doc.pos], doc); } |
желательно писать
1 2 3 4 5 6 |
function(doc) { if (doc.cid && doc.pos) { emit([doc.cid, doc.pos], doc); } } |
т.к. при регулярных возникновениях ошибок при использовании map-функции (что может случиться, если свойства нет) CouchDB запрещает любое индексирование, чтобы прекратить дальнейшее использование ресурсов.
Similar Posts
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.
2 Responses so far.