ゼットログ

よしなしごとを記す

showとlist(2)

今度はCouchDBに格納しているドキュメントを一覧表示させてみた。デザインドキュメントを以下のように準備。

{
   "_id": "_design/list_doc",
   "_rev": "33-1686468689",
   "language": "javascript",
   "lists": {
       "simpleForm": "(function (head, row, req, row_info) 
         {if (row) {return {body: \"\\n<li><a href=http://hostname:5984/dbname/_design/showdoc/_show/show_detail/\" +
          row.key +\" target=_blank>\" + row.value + \"</a></li>\"};}
    //先頭と最後尾も指定できる。awkのようだ。
         else if (head) {return {body: \"<h3>懐かしいゲームソフト</h3><ul>\"};}  
         else {return {body: \"</ul>\" + \"<p>合計: \" + row_info.row_number + \" 本</p>\"};}})"
   },
   "views": {
       "basicView": {
           "map": "(function (doc) {emit(doc._id,doc.title);})"
       }
   }
}

"basicView"というビューでkeyとして_idをvalueとしてtitleを渡す。

"basicView": {
    "map": "(function (doc) {emit(doc._id,doc.title);})"

ビューの結果として表示される各行の体裁を整えて出力する"my_list"を定義。前回のshowフォーマットへのリンクを設定した。これで「ドキュメントの一覧表示」→「指定したドキュメントの詳細表示」という流れができたことになる。

       "my_list": "(function (head, row, req, row_info) {
          if (row) {return {body: \"\\n<li><a href=http://hostname:5984/dbname/_design/showdoc/_show/show_detail/\" + row.key +\" target=_blank>\" + row.value + \"</a></li>\"};}

ブラウザに以下のアドレスを入力。

http://hostname:5984/dbname/_design/list_doc/_list/my_list/basicView

次のような結果が返ってきた。素晴らしい。

<h3>懐かしいゲームソフト</h3><ul>
<li><a href=http://hostname:5984/dbname/_design/showdoc/_show/show_detail/game01 target=_blank>桃太郎伝説</a></li>
<li><a href=http://hostname:5984/dbname/_design/showdoc/_show/show_detail/game02 target=_blank>PC原人</a></li>
<li><a href=http://hostname:5984/dbname/_design/showdoc/_show/show_detail/game03 target=_blank>ドラゴンスピリット</a></li>
<li><a href=http://hostname:5984/dbname/_design/showdoc/_show/show_detail/game04 target=_blank>竜の子ファイター</a></li></ul><p>合計: 4 本</p>

"row_info"というオブジェクトにはいくつかの便利なプロパティが実装されている模様。「合計:4本」のところは"row_info.row_number"を採用してみた。他にどんなプロパティがあるのかはソースを見ないとわからんかな。