Skip to content

Хранилища данных в Node.js: CouchDB

17/02/2010

Я продолжаю исследовать и пробовать на зуб разные хранилища данных для Node.js. Tokyo Tyrant оставил ощущение что хотя сам по себе Tyrant — штука довольно мощная, коннектор пока недостаточно проработан для использования в каких-либо сложных проектах. Возможно через некоторые время я к нему ещё вернусь. А пока — Apache CouchDB🙂

Установка

Сначала нам нужен JavaScript-движок Tracemonkey:

apt-get install libmozjs-dev

В Debian CouchDB прощевсего получить с помощью apt-get:

apt-get install couchdb

Имейте в виду, CouchDB написана на Erlang и потянет за собой всякие Erlang-библиотеки. У меня инсталлятор потребовал 63 Мб места. После установки couchdb сразу запустится.

Поставится скорее всего не самая последняя версия (у меня это 0.8.0), но для пары экспериментов пойдёт и это. CouchDB прямо из коробки предоставляет удобный веб-интерфейс к данным, который по умолчанию висит на localhost:5984. Так как мы собираемся использовать его из Windows-машины, лучше перевесить его на внешний IP. Идём в /etc/couchdb и редактируем файл couch.ini. Нужная нам опция находится прямо в начале файла:

; etc/couchdb/couch.ini.tpl.  Generated from couch.ini.tpl.in by configure.

[Couch]

ConsoleStartupMsg=Apache CouchDB is starting.

DbRootDir=/var/lib/couchdb

Port=5984

BindAddress=127.0.0.1

DocumentRoot=/usr/share/couchdb/www

LogFile=/var/log/couchdb/couch.log

UtilDriverDir=/usr/lib/couchdb/erlang/lib/couch-0.8.0-incubating/priv/lib

LogLevel=info

Меняем BindAddress на IP виртуальной машины (в моём случае это 192.168.175.128). Теперь нам надо перезапустить демон couchdb. Делается это просто:

couchdb -d
couchdb -b

CouchDB должен запуститься с новым файлом настроек. Открываем браузером IP виртуальной машины, порт 5984. Увидим что то вроде этого:

{"couchdb":"Welcome","version":"0.8.0-incubating"}

Это значит что сервер нам отвечает. Добавив к адресу /_utils/, попадём в админку CouchDB. Здесь можно позапускать тесты (справа, в меню «Test Suite»).

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

Готовый коннектор к CouchDB пока всего один. Но т.к. CouchDB отдаёт данные в JSON и общается по протоколу HTTP, работать с ней можно и совсем без коннекторов или написать свой. Но сначала попробуем творение товарища Sixtus. Скачиваем свежий код со страницы проекта (сверху кнопка «Download source«), переносим в виртуальную машину и распаковываем.

Вначале создадим в админке базу для экспериментов. Можно сделать то же самое в коде, но удобнее один раз сделать это через веб-интерфейс. Жмём Create database на главной странице админки, вводим имя. Я выбрал blog, т.к. планирую использовать CouchDB в Cassiterite как замену Tokyo Tyrant.

Теперь попробуем записать и прочитать документ из базы.

var couch = require('./couch/module/node-couch').CouchDB;
var sys = require('sys');

couch.debug = false;

db = couch.db('blog', 5984, '192.168.175.128');


var doc = {title: "Blog post", text:"Post text", tags:""};

db.saveDoc(doc, {
    'success' : function(saved) {
        sys.puts('DONE: ' + saved._id);
        db.openDoc(saved._id, {
            success: function(post) {
                sys.puts(JSON.stringify(post));
            },
            error: function() {
                sys.puts('Error happened.');
            }
        });

    },
    'error' : function() {
        sys.puts('Error saving doc');
    }
});

Коннектор использует не совсем привычный синтаксис, в котором обработчики передаются как свойства объекта опций. Код при этом получается несколько «развесистым», но для демонстрации годится.

Сначала мы подключаем модуль и берём из него только объект CouchDB. Собственно, больше модуль ничего не экспортирует. Обратите внимание, по умолчанию коннектор будет запущен в debug-режиме и будет спамить в консоль деталями каждого соединения, примерно так:

COUCHING /blog/ -> POST
COMPLETED /blog/ -> POST
DONE: 31e6698eac80218d1c9eddffb2c9ab58
COUCHING /blog/31e6698eac80218d1c9eddffb2c9ab58 -> GET
COMPLETED /blog/31e6698eac80218d1c9eddffb2c9ab58 -> GET

После этого подключаемся к нужной базе. Обратите внимание — если при установке мы перевесили couchdb на внешний IP, соединяться нужно тоже с ним. После этого создаём документ, сохраняем его и в success-обработчике сразу же запрашиваем обратно. Документ должен вернуться в том же виде, но с двумя дополнительными свойствами: _id указывает на идентификатор документа внутри CouchDB, _rev указывает на идентификатор версии документа. С версиями документов мы поработаем как нибудь в другой раз.

Получить все документы из базы можно с помощью метода allDocs:

db.allDocs({
    success: function(docs) {
        sys.puts(JSON.stringify(docs));
    },
    error: function() {
        sys.puts('Error getting docs');
    }
});

В success-обработчик будет передан объект примерно такого вида:

{
	"total_rows": 4,
	"offset": 0,
	"rows":[массив результатов]
}

C map-reduce запросами я пожалуй поиграю в следующий раз.

Ссылки по теме

Apache CouchDB
Коннектор CouchDB, улучшенный Грегом Риттером

Добавить комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: