mongoDB用のO/RMapperにMongoidを使う

fluentdで吐いたデータをmongoDB用のormを使って扱いたいので準備をしていきます。

ORMは

あたりがメジャーらしいですが、MongoManagerは以前使ったことある&検索してみるとMongoidのほうが記事数が多い&ドキュメントが豊富、ということでMongoidを使ってみることにします。

rails+mongoidセットアップ

2,3ステップで済んだのでとても簡単でした。

  • gemのインストール
  • 設定ファイルconfig/mongoid.ymlを作成
  • (デフォルトのORMをactive recordに戻す)

まずはgemを追加.

#ORMapper for mongodb
gem 'mongoid'
gem 'bson_ext'

install.

bundle install

で、コマンドでmongoid用の設定ファイルを作ろうとしたら、エラー(ヽ'ω`)

i$ rails generate mongoid:config
/Users/takayuki/.rvm/gems/ruby-1.9.3-p385/gems/kaminari-0.14.1/lib/kaminari/models/mongoid_extension.rb:24:in `block in <module:Document>': undefined method `scope' for Mongoid::Document:Module (NoMethodError)
・・・

undefined method `scope' for Mongoid::Document:Module · Issue #415 · amatsuda/kaminari によると「rails4に対応してるこっち使いなYO!」ということなのでGemfileのmongoidのところを書き換えて、入れなおす。

gem 'mongoid', '~> 4', github: 'mongoid/mongoid'

次は問題なくコマンド通りました。

$ rails generate mongoid:config
      create  config/mongoid.yml

mongoidはデフォルトのormであるactive recordを置き換えてる形になっているのですが、今回はログ用にサブで使うので、デフォルトをactive recordに戻します.

config/application.rb:

config.generators do |g|
  g.orm :active_record
end

これでmongo generate model hogeとしたときは、activerecordのモデルが今まで通りできます。 mondoidのmodelを作りたいときは

$ rails generate mongoid:model

とすればOK。

あと参考にさせていただいた RailsでActiveRecordとMongoidの共存のさせ方 - Qiita [キータ] によるとclassのロードがデフォだとmodels以下すべてになってしまうそうなので、逐次設定します。 アナログ設定になりますが、自分のケースだとそこまでmodel数も増えないだろうからそんな手間にはならなそうです。

これであとはもうコマンドでmodelを逐次追加するだけ!