ゼットログ

よしなしごとを記す

ドキュメントにタグをつける

とはいっても、ドキュメントにリストとして値を持たせるだけ。それでもなかなか便利な予感。とりあえず、こんなデータを用意。

{
   "_id": "doc05",
   "_rev": "4-3282807954",
   "tags": [
       "USA",
       "DRAMA"
   ],
   "title": "GRAN TORINO",
   "date": "2009-04-28",
   "rank": 1,
   "situations": [
       "alone",
       "friends"
   ]
}

{
   "_id": "doc06",
   "_rev": "4-4104211151",
   "title": "SLUMDOG$MILLONARE",
   "tags": [
       "INDIA",
       "DRAMA",
       "LOVE"
   ],
   "date": "2009-05-03",
   "situations": [
       "alone",
       "lovers"
   ]
}

そしてビューを次のように実装。

//map
function(doc) {
  if (doc.tags) {
    doc.tags.forEach(function(tag) {
      emit(tag, 1);
    });
  }
}

//reduce
function(keys, values) {
  return sum(values);
}

そして、このアドレスへアクセスすると次のような結果が返ってくる。"group=true"をパラメータとして付与しないと単にvalueの5が返ってきてしまう。
http://hostname:5984/database名/_design/ドキュメント名/_view/ビュー名?group=true

{"rows":[
  {"key":"DRAMA","value":2},
  {"key":"INDIA","value":1},
  {"key":"LOVE","value":1},
  {"key":"USA","value":1}
]}

RDBMSでいうと"tags"というカラムでGROUP BYしてCOUNT(*)している感じだ。
ただ、RDBMSと違うのは一つのデータに複数のタグを設定している点。そのため、各ドキュメントは任意のタグを設定した分だけ重複してカウントされる。RDBMSで同じことをやりたい場合はtagsの部分を別のテーブルに外出しにして結合しないとできない。ニーズに合致すれば大変便利だと思った。
他にも書きたいことがあったけど、文字データがどうやら限界らしいorz