予習CouchDB

BPStudy#32の予習です。とりあえず、インストールから動かしてみるところまで。

CouchDB

  • SQLを使わないドキュメント指向データベース
  • DBとの通信にHTTPを使い、特別なドライバがいらない
  • データはJSON形式で表現される“ドキュメント”としてやりとりする

インストール

Mac OSX

CouchDBXで、一発インストール
http://janl.github.com/couchdbx/


アプリケーションから起動したら

$ curl http://localhost:8954/
{"couchdb":"Welcome","version":"0.11.0"}

{"couchdb":"Welcome","version":"0.11.0"}が表示されたら、正しく起動している。
http://localhost:5984/_utils/にアクセスして、管理コンソール(Futon)が表示されることを確認。

Linux(Ubuntu 9.10使ってます)

1.ソースからインストールする
http://couchdb.apache.org/downloads.html

aptだと、旧バージョンがインストールされてしまうので非推奨とのこと。
CouchDBの前に予め、以下をインストールする必要がある。

$ sudo apt-get install build-essential erlang libicu-dev libmozjs-dev libcurl4-openssl-dev
$ tar zxvf apache-couchdb-[VERSION].tar.gz
$ cd apache-couchdb-[VERSION]
$ ./configure
$ make
$ sudo make install

2.インストール後
/usr/local/以下にインストールされるので、CouchDBの実行ユーザ、ファイルオーナーを作る。

$ sudo adduser --system --home /usr/local/var/lib/couchdb -no-create-home --shell /bin/bash --group --gecos "CouchDB" couchdb

3.CouchDBのディレクトリの所有者を変更

$ sudo chown -R couchdb:couchdb /usr/local/etc/couchdb
$ sudo chown -R couchdb:couchdb /usr/local/var/lib/couchdb
$ sudo chown -R couchdb:couchdb /usr/local/var/log/couchdb
$ sudo chown -R couchdb:couchdb /usr/local/var/run/couchdb

4.CouchDBディレクトリのパーミッションを変更する

$ sudo chmod -R 0770 /usr/local/etc/couchdb
$ sudo chmod -R 0770 /usr/local/var/lib/couchdb
$ sudo chmod -R 0770 /usr/local/var/log/couchdb
$ sudo chmod -R 0770 /usr/local/var/run/couchdb

これで、一通り準備が完了したのでCouchDBを起動。

$ sudo -i -u couchdb couchdb -b
Apache CouchDB has started, time to relax.

http://localhost:5984/_utils/にアクセスして、Futonが表示されることを確認。
Daemonとして起動したい場合は、以下の操作で起動・停止・ステータスの確認ができる。

$ sudo /usr/local/etc/init.d/couchdb start
$ sudo /usr/local/etc/init.d/couchdb stop
$ sudo /usr/local/etc/init.d/couchdb status

基本操作

ターミナルから、データベースの一覧を取得する。

$ curl http://localhost:5984/_all_dbs
[]

まだ何もやってないので、空です。


最初のデータベースを作成してみる。

$ curl -X PUT http://localhost:5984/firstdb
{"ok":true}
$ curl http://localhost:5984/_all_dbs
["firstdb"]


同じ名前のデータベースを作成しようとするとエラーが返る。

$ curl -X PUT http://localhost:5984/firstdb
{"error":"file_exists","reason":"The database could not be created, the file already exists."}


データベースを消す時は、

$ curl -X DELETE http://localhost:5984/firstdb
{"ok":true}
$ curl http://localhost:5984/_all_dbs
[]


以上は、ターミナルでデータベースを操作で、同じことはFutonを使えばGUIで操作できる。
http://localhost:5984/_utils/

MacのCouchDBXであれば、CouchDB起動時のウィンドウで管理画面が使えます。

データベースとドキュメントを作成する

FutonのOverviewページで「Create Database」をクリックすることで、データベースを作成できる。
"hello-world"でデータベースを作成したら、「Overview > hello-world」というページに移るので、「New Document」をクリックしてドキュメントを作成する。"_id"というフィールドが作成されたことを確認して「Save Document」でドキュメントを保存。保存すると新たに「_rev」というフィールドができる。





新しいフィールドを追加するには「Add Field」をクリック。valueは、JSON形式である必要があるので、以下のような形式になる。

{
  name: 'daigo3',
  place: 'Yokohama'
}

// 配列もOK
[1, 2, 3]

// 文字列もOK
'String'



フィールドは「Source」タブからも編集・確認できる。最後に「Save Document」をクリックすると"_rev(ドキュメントの版)"が更新される。

{
   "_id": "1fa487039df82eb22d63a1531d000481",
   "_rev": "4-275e3ca27492c7648ba2ca2f04547770",
   "me": "{name: 'daigo3'}",
   "str": "'string'",
   "arr": [
       1,
       2,
       3
   ]
}

クエリを実行する

テスト用に3つのドキュメントを作りました。

{
  "_id": "52443afd48f481ce24b3dee2df0006ca",
  "_rev": "1-9e59e6f7b92fdac46ae17f7feb39567e",
  "name": "KidA",
  "info": {
    "age": 19,
    "sex": "male"
  }
}

{
  "_id": "52443afd48f481ce24b3dee2df0007b2",
  "_rev": "1-b7cd2bd9f1995f9b84d2c99d68b723ee",
  "name": "KidB",
  "info": {
    "age": 18,
    "sex": "female"
  }
}

{
  "_id": "52443afd48f481ce24b3dee2df000b26",
  "_rev": "1-2a0075d2ef6c8909c9df2367bf518e5c",
  "name": "KidC",
  "info": {
    "age": 15,
    "sex": "female"
  }
}


「View」のセレクトボックスから「Temporary View」を選択するとView(Map関数とReduce関数の組)作成画面に遷移するので、ここでmap関数を作成する。以下のMap関数で、名前をkeyとしたデータが取得できる。

// Map関数
// param: document
function(doc) {
  var name;
  var info = [];
  if(doc.name && doc.info) {
    name = doc.name;
    for(item in doc.info) {
      info.push(doc.info[item]);
    }
    emit(name, info);
  }
}