Пример работы с 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 запрещает любое индексирование, чтобы прекратить дальнейшее использование ресурсов.
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.
2 комментария so far.