ScalaでMongoDBはじめました

最近、ScalaからMongoDB使っていたりするので、簡単に使いかたをメモしておこうかと思います。まだ使い始めたばかりで、たいしてMongoDB自体理解してませんが、とりあえず書いて、自分の頭の中整理するというか、間違ってたりもっといい方法あったら教えてもらっちゃおう的なメソッドです(´・ω・`)

簡単にMongoDB自体について整理しておくと

  • MongoDB自体はC++で作られてます
  • Jsonやそれ以外の数種類のJavaScriptのオブジェクト(正規表現、Dateオブジェクト)などがそのまま保存できます
  • スキーマの定義とかありません
  • スキーマないから、一般的なRDBMSでのCREATE TABLEのようなものが必要ありません
  • RDBMSでのテーブルに当たる物をCollectionと呼ぶみたいです
  • RDBMSとおなじような、KeyのIndexなどは指定できるみたいです
  • JavaScriptのコンソールがついてます。ここからだいたい何でもできます
  • コンソールが、補完が効いたりしてすごく便利です
  • JavaScriptの関数をDB側にまるまる送りつけて、実行できたりします
  • 「あるCollectionのある値をインクリメント」というような処理が、ひとつの操作でAtomicにできます。*1
  • 更新する際に、DBに毎回書きこむわけではなく、わざと一旦メモリ上に保持して、数秒後に書きこむので、書き込みの性能がいいらしいです
  • Capped Collectionという、「サイズ固定、要素の削除できない、順番もInsertした順」そのかわりInsertが爆速っていうものがあります
  • ShardingとかMapReduceとかその他色々あるらしいですが、その辺はまだしりません(´・ω・`)


今のところの自分の理解はこんなところです。


一応のMongoのインストール方法も書いておきます。

  1. ここから、環境にあったものをダウンロード(2011年5月1日現在の最新版は1.8.1)
  2. デフォルトだと、/data/dbにデータを保存するので、事前にそのディレクトリを作成して、書き込みの権限設定しておく*2
  3. 解凍したファイルのbinというディレクトリの下に、mongodという実行ファイル*3があるのでそれを実行*4


うまくいけば、上記の手順だけで、DBが起動した状態になるはずです。


Scalaから使う場合ですが、MongoDBの公式のものでCasbahというライブラリがあります。これ自体は、Javaのライブラリをwrapしたものです。その他にもRougeというものもあるらしいですが、今回はCasbahを使います。

Casbahについては、ReSTARTRさんのScalaからMongoDBへアクセスする – Casbah編
というのに基本的なことがだいたい書かれていて、参考にさせていただきました。
で、まったく同じこと書いてもしょうがないので、できるだけ役に立ちそうなことを書いていこうかと思います。

そもそもCasbahに関しては、ひと通りのチュートリアルのドキュメントは充実してるので、英語分かる人は、こんなもの読んでないで直接公式のドキュメント読んでください(´・ω・`)
2011年5月1日現在の最新版は2.1.2のようです。epubや、pdfのものまであってとても親切です。あともちろんソースコードもGithubで公開されてます。そして、scaladoc


Casbahの特徴として、

import com.mongodb.casbah.Imports._

という一行だけ書けばいいようにつくられているようです。該当する部分のソースコード見てみたら、ValidBSONType、TypeImports、BaseImports、Implicitsというようにそれぞれモジュール化されてtraitが定義されていて、最終的にImportsというobjectがそれらすべてを継承するアーキテクチャになってるようです。ちょっと前に

"「ユーザー側は、import文を1つだけ書けばいい」っていうパターンのライブラリの作成方法"的な解説記事が欲しい・・・ 今まで見てきた、いつくかの #scala のライブラリがそうなってる・・・less than a minute ago via web Favorite Retweet Reply

というtweetしましたが、これのことです。
あとは、Scalazとかscala-timeなどもそうなってるみたいですね。*5

Casbahの使い方から話それましたが、いよいよCasbahの使い方書いていこうかと思います・・・ってところでなんか長くなったし疲れたので、今回はここまでにしてまた気が向いたら書きます、すいません(´・ω・`)

*1:一度値をとってきて、更新した値をまた送るというような処理が必要ない

*2:もしくは起動時にコマンドライン引数で、自分の指定した場所に設定することもできるらしい

*3:windowsだったらmongod.exe

*4:これ自体の実行権限がなくて失敗する場合もあるので、権限設定しておきましょう

*5:Scalazというobjectが数十個のclassやtraitを継承してる・・・