そういうことだったんですね

いろいろ調べたり学んだりしたことを忘れないように書き連ねています

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")