finding your data with views
DESCRIPTION
This is my summary for Chapter 06 of "CouchDB: The Definitive Guide".This material was used on the CouchDB-JP study session, RelaxCafe.break02.TRANSCRIPT
CouchDB : The Definitive Guide 勉強会 #2
06. Finding Your Data with Views
2009/10/16
RelaxCafe@CouchDB break.2
id:yssk22 (CouchDB-JP)
先に読後感想 とりあえず動かしながら考えてみましょう。
手元に CouchDB ない人は適当につないでください。接続情報
○ SSID: macbook-yssk22○ WEP: time2relax○ IP は 192.168.1.0/24 で static に降ってください。○ http://192.168.1.226:5984/_utils/
CouchDB 0.10.0 relax_xxxx と書いてある DB は削除しないでください!
View の目的 ドキュメントのフィルタリング フォーマットと並び替え インデックスを作る
ドキュメントを効率的に見つけるために!リレーションを定義するために!
様々な計算
Relax1. ビューの作成 ブログのデータを日付順に並び替えよう 実際にやってみる
Relax1. ビューの作成 データが格納してあるデータベース
relax_data1 適当に新しく DB を作っ
て、 relax_data_1 からデータをコピー
map 関数を定義して、結果を確認するデザインドキュメント "docs" を作
り、 "by_date" というビューを定義
map function の中身 1 つ 1 つのドキュメントに対する処理を
定義する関数function(doc){ .... }emit(key, value) で出力を定義する出力される key の辞書順で並び替えされる
デザインドキュメントの views に文字列として登録
map function の実行タイミング
各ドキュメントに対して、ビューの呼び出し時に 1 回ずつ呼ばれるN 個のドキュメントがあれば N 回 map が呼
ばれる。map の結果は B-Tree に保存される
○ オリジナルのドキュメントに変更がない限り2 度以上は呼ばれない
○ B-Tree は Key に基づく構成になっているため、 Key に対する検索、並び替えが高速
ドキュメントを変更したときのView の挙動 map 結果の B-Tree のそれぞれのノードは、どの
ドキュメントから生成されたか、の情報を持っている。古いノードは CouchDB により invalid マークがつけら
れ、 View の結果に表れなくなる。
ドキュメントが追加 / 更新されたときにのみ、 map 関数が新しく追加されたドキュメントに対して実行され、結果が View の B-Tree に保存される。
○ 実際には、ドキュメントが追加 / 更新されて、次に Viewにアクセスがあったとき。
Relax2. ビューを使った検索 (1)
特定の日付のタイトルを検索しよう 実際にやってみる
Relax2. ビューを使った検索 (1)
ブラウザ (or curl) でアクセス URI にクエリ文字列 (key) をつける
/{db}/_design/docs/_view/by_date?key="2009/01/30 18:04:11"
key パラメーター emit(key, value) の key に一致する結果
を返す。 次のような場合
emit("a", "foo");emit("a", "bar");
?key="a" でアクセスすると ... ?
Relax3. ビューを使った検索 (2)
指定範囲の日付のタイトルを検索しよう2009 年 1 月のタイトルを検索
実際にやってみる
Relax3. ビューを使った検索 (2)
ブラウザ (or curl) でアクセス URI にクエリ文字列 (key) をつける
/{db}/_design/docs/_view/by_date?startkey="2009/01/01 00:00:00"&endkey=" 2009/02/01 00:00:00 "
Relax4. ビューを使った検索 (3)
指定範囲の日付のタイトルを検索しよう日付の範囲を Number 配列にして扱いやす
くする 実際にやってみる ?
Relax4. ビューを使った検索 (3)
ブラウザ (or curl) でアクセスemit(doc.date, doc.title) を次の形になるよう
に書き換える。○ emit([year,month,day, hour, minutes, second],
doc.title);
URI にクエリ文字列 (key) をつける/{db}/_design/docs/_view/by_date?
startkey=[2009,1,1,0,0,0]&endkey=[2009,2,1,0,0,0]
Relax5. ビューを使った検索 (4)
特定のタグを持つタイトルを検索。emit のキーは ?
実際にやってみる ?
クエリ文字列に関して key={JSON}
指定したキーにマッチする結果を検索 startkey={JSON}
指定したキーより大きい結果を検索 endkey={JSON}
指定したキーより小さな結果を検索 descending=true
キーの逆順に " たどる "○ startkey, endkey の解釈も変わるので注意
結果を並び替えるのではなく、 B-Tree のたどり方を指定する点に注意。 limit=Number
キーをたどって Number 個見つかった時点で結果を返す。 skip=Number
キーをたどるときに、最初の Number 個をとばす
これ以降 まだ完成していない模様
資料じゃなくて元の本が! 補完しながら進めます。
宣伝reduce の仕組みは少し複雑なので、とりあえず
使い方知りたい方は、 developerWorks の記事を読むといい!○ http://
www.ibm.com/developerworks/jp/web/library/j_wa-couchdb03/index.html
Relax6. ビューを使った計算 コメントの数をカウントする 実際にやってみる
ちょっとデータが足りないので、適当に作ってください。データ作ったら relax_data1 に向けてレプ
リカしてもらえると !
追加するデータ "post_id"
"biking", "bought-a-cat", "hello-world" のどれか "name"
適当に "body"
適当に "created_at"
"YYYY/MM/DD HH:MM:SS +0000" "type"
"comment"
Relax6. ビューを使った計算
reduce と B-Tree
B-Tree の Non-Leaf ノードに保存されるmap の結果と同じくキャッシュが有効!Non-Leaf 同士の計算をするときは第 3 引数
rereduce が true になる○ Leaf ノード (map の結果 ) 同士の計算の場合
rereduce は false
CouchDB の B-Tree は B+-Tree
イメージ
map()
rereduce()
reduce()