DB - MongoDB(3) mongoid
mongoid ( MongoDB を ruby から使うライブラリの一種です。
ODMであり ActiveRecordと同じような記述ができるので rails から使うには便利。
単体でも使えます。
Rails4 から動かす
アプリケーションを作成します。
ActiveRecords を使わないので -O (--skip-active-record) を指定します。
-B は bundle を実行しないオプションです。
$ rails new mongoid_app -O -B
Gemfile に以下を追加。
最新版の mongoid は 3.1.5でrails4には対応していません。 mainブランチは 4.0.0 なので github からインストールするのもOK。
今回は、(安定版からブランチしたと思われる) mongoid_rails4 を使います。
gem 'mongoid_rails4', :require => 'mongoid'
その後 bundle で gem を更新します。
$ bundle update
Generator を使って <app_path>/config/mongoid.yml を作成します。
$ rails g mongoid:config
作成されたファイルの内容は次の通り。コメントを割愛した。
development: 以下に development 環境で使う。
sessions/default が初期状態で呼び出される設定で必ず必要。
sessions/default/database に データベース名
、
sessions/default/hosts に mongod が起動しているホストとポート名を指定する。
production 環境では replica_set や sharding の設定を行うのでいずれ。
development: sessions: default: database: mongoid_development hosts: - localhost:27017 options: options: test: sessions: default: database: mongoid_test hosts: - localhost:27017 options: consistency: :strong max_retries: 1 retry_interval: 0
モデルの作成
$ rails g mongoid:model artist name:string age:string
コンソールからActiveRecordのように使ってみます。
> Artist.create(name: "sadamasashi", age: 61) => #<Artist _id: 52859d16e138234a16000001, name: "sadamasashi", age: 61> > Artist.create(name: "Ken Hirai", age: 41) => #<Artist _id: 52859dbde138234a16000002, name: "Ken Hirai", age: 41> > Artist.create(name: "lady gaga", age: 27) => #<Artist _id: 52859dc4e138234a16000003, name: "lady gaga", age: 27> > Artist.all.to_a => [#<Artist _id: 5284be5453c852e8074e52ca, name: "Syd Vicious", age: 18.0>, #<Artist _id: 52859d16e138234a16000001, name: "sadamasashi", age: 61>, #<Artist _id: 52859dbde138234a16000002, name: "Ken Hirai", age: 41>, #<Artist _id: 52859dc4e138234a16000003, name: "lady gaga", age: 27>] > Artist.where(:age.lte=>60).to_a => [#<Artist _id: 5284be5453c852e8074e52ca, name: "Syd Vicious", age: 18.0>, #<Artist _id: 52859dbde138234a16000002, name: "Ken Hirai", age: 41>, #<Artist _id: 52859dc4e138234a16000003, name: "lady gaga", age: 27>] > Artist.where(_id:"52859dbde138234a16000002").delete => 1
mongo のシェルから確認してみます
$ mongo <db name> > show collections artists system.indexes > db.artists.count() 2 > db.artists.find().toArray() [ { "_id" : ObjectId("52859d16e138234a16000001"), "name" : "sadamasashi", "age" : 61 }, { "_id" : ObjectId("52859dc4e138234a16000003"), "name" : "lady gaga", "age" : 27 } ]
MongoId を単体で使う
gem を使ってインストール。
Gemfileを作成
gem "mongoid"
インストール
$ bundle install
mongoid.xml を用意する。rails と同じものです。
development: sessions: default: database: mongoid_development hosts: - localhost:27017
rubyのコマンド上で以下を使用
Mongoid.load!("./mongoid.yml", :development)
ソースコードのサンプル
require 'mongoid' Mongoid.load!("./mongoid.yml", :development) class Artist include Mongoid::Document field :name, type: String embeds_many :instruments end class Instrument include Mongoid::Document field :name, type: String embedded_in :artist end # var syd = db.artists.findOne( {name: "Syd Vicious", age: { $gte : 18 , $lte: 25 } } ) syd = Artist.where(name: "Syd Vicious").between(age: 18..25).first # db.artists.update( syd, { $push : {instruments: {_id: ObjectId(), name: "Bass"} }} ) syd.instruments.create(name: "Bass")