Finding Your Data with Views

1,363 views

Published on

This is my summary for Chapter 06 of "CouchDB: The Definitive Guide".
This material was used on the CouchDB-JP study session, RelaxCafe.break02.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,363
On SlideShare
0
From Embeds
0
Number of Embeds
50
Actions
Shares
0
Downloads
13
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Finding Your Data with Views

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

×