Ruby on RailsでMongoDBを使ったときのまとめ

railsでmongodbを使用しての開発メモ

mongodbを使用するときのおすすめgem

Gemfile

ruby '2.3.1'
~~~
gem 'mongoid', '~> 6.0.0'
# mongoid 6のバージョンにまだ対応していないのでforkしています
gem 'mongoid-enum', github: 'chocoken517/mongoid-enum'

mongoid

configのinstall

rails g mongoid:config

config/mongoid.ymlが作成される

基本的な書き方

class Place
  include Mongoid::Document

  field :name, type: String
  field :prefecture, type: String
end

typeはドキュメントを参考にしてください

index

class Place
  include Mongoid::Document

  field :name, type: String

~~~~

  index(name: 1)
end
  • indexを複数つける場合
index(name: 1, prefecture: 1)
  • ユニークにしたい場合
index({ name: 1 }, unique: true)
  • ユニークだけどnilを許可したい場合
index({ name: 1 }, unique: true, sparse: true)

Timestamps

  • Mongoid::Timestampsincludeすればcreated_atupdated_atfieldが追加されます
class Place
  include Mongoid::Document
  include Mongoid::Timestamps
end

関連(埋め込み)

embeds_one

  • ハッシュ
class Place
  include Mongoid::Document

  field :name, type: String
  field :prefecture, type: String

  embeds_one :image, cascade_callbacks: true
end
class Image
  include Mongoid::Document

  field :name, type: String
  field :path, type: String

  embedded_in :place, inverse_of: :image
end

登録

> Place.create(name: '東京駅',  prefecture: '東京都', image: Image.new(name: 'ホーム', path: 'image/home.png'))

登録結果

{
    name: "東京駅",
    prefecture: "東京都",
    image {
       name: "ホーム",
       path: "image/home.png" 
    }
}

embeds_many

  • 配列
class Place
  include Mongoid::Document

  field :name, type: String
  field :prefecture, type: String

  embeds_many :images, cascade_callbacks: true
end
class Image
  include Mongoid::Document

  field :name, type: String
  field :path, type: String

  embedded_in :place, inverse_of: :images
end

登録

> place = Place.create(name: '東京駅',  prefecture: '東京都')
> place.images << Image.new(name: 'ホーム', path: 'image/home.png')
> place.images << Image.new(name: 'ホーム2', path: 'image/home2.png')
> place.save

登録結果

{
    name: "東京駅",
    prefecture: "東京都",
    image [
      { name: "ホーム", path: "image/home.png" },
      { name: "ホーム2", path: "image/home2.png" }
    ]
}

mongoid-enum

  • mongoidでenumを使用したいとき
  • mongoid-enumのReadmeに充実しているので、基本困ることはない
class Place
  include Mongoid::Document
  include Mongoid::Enum

  field :name, type: String
  enum :category, %i(station park hotel)
end

使用方法

> place = Place.create(name: '東京駅', category: :station)
> place.station?
true
> place.park?
false
> place.hotel!
:hotel
> Place.station
Mongoid::Criteria # scope
> Place::CATEGORY
[:station, :park, :hotel]

Default value

enum :category, %i(c park hotel), default: :park

Multiple values

enum :categories, %i(station park hotel), multiple: true
> place = Place.new
> place.categories << :park
> place.categories << :hotel
> place.save

> place.hotel?
true
> place.station?
false
> place.categories
[:park, :hotel]