Mongoid

http://mongoid.org/

MongoDB のRuby用O/R Mapper

MongoMapperもよく使われているみたいだけどMongoidの方がドキュメントがしっかりしていて使いやすそう。

Mongoid 2 を使うには最新版のMongoDBが必要。Mongoid 2でないとドキュメントに載っている機能(Validationとか)が使えなかったりする。

ドキュメント

class Person

include Mongoid::Document

include Mongoid::Timestamps ## :created_at, :updated_at を自動設定

field :first_name

field :middle_initial

field :last_name

field :birthday, :type => Date

field :blood_alcohol_level, :type => Float, :default => 0.0

validates_presence_of :first_name, :message => ""

validates_format_of :first_name, :with => /[A-Za-z]/

validates_uniqueness_of :first_name

end

String以外は型を指定

Array, BigDecimal, Boolean, Date, DateTime, Float, Hash, Integer, String, Symbol, Time

Validationも使える

Persistence

Create

person = Person.create(:first_name => "Syd", :last_name => "Vicious")

Save

person = Person.new(:first_name => "Syd", :last_name => "Vicious")

person.save # or person.upsert

saveはtrue/falseを返す。save!にすると失敗したとき例外を投げる。

Update

person = Person.new(:first_name => "Syd", :last_name => "Vicious")

person.update_attributes(:first_name => "Nancy")

Destroy

person = Person.create(:first_name => "Syd", :last_name => "Vicious")

person.destroy

person.delete ##deleteはcallback(before_destroyとか)を無視する。

Querying

Find色々

Person.all(:conditions => { :first_name => "Syd" })

Person.find(:all, :conditions => { :first_name => "Syd" })

Person.first(:conditions => { :first_name => "Syd" }) ## 見つからなければnil

Person.find(:first, :conditions => { :first_name => "Syd" })

Person.last(:conditions => { :first_name => "Syd" })

Person.find(:last, :conditions => { :first_name => "Syd" })

Person.find_or_create_by(:first_name => "Syd")

Person.find_or_initialize_by(:first_name => "Syd")

find以外にも色んな便利な検索ができる

Person.all_in(:aliases => [ "Jeffrey", "The Dude" ])

Person.any_in(:status => ["Single", "Divorced", "Separated"])

Person.any_of({ :status => "Single" }, { :preference => "Open" })

Person.and(:age.gt => 18, :gender => "Male")

Person.where(:status => "Married").count

Person.excludes(:status => "Married")

Person.criteria.id("4b2fe28ee2dc9b5f7b000029")

Person.limit(20)

Address.near(:position => [ 37.7, -122.4, 10 ])

Person.not_in(:status => ["Divorced", "Single"])

Person.only(:first_name, :last_name)

Person.desc(:last_name).asc(:first_name)

Person.descending(:last_name).ascending(:first_name)

Person.order_by(:last_name.desc, :first_name.asc, :city.desc)

Person.order_by([[:last_name, :desc], [:first_name, :asc]])

Person.skip(100) ## offset

Person.where(:age.gt => 18, :gender => "Male")

Person.where(:last_name => /^Jord/)

Person.where(:age.gt => 18, :age.lt => 30)

合わせ技

Person.only(:first_name, :last_name).where("address.post_code" => "94133")

Person.only(:first_name).where("phones.country_code" => 1).in(:last_name => ["Vicious"])

Person.where(:last_name => "Zorg").and(:middle_initial => "J")

Person.where(:title.all => ["Sir"])

Person.where(:age.exists => true)

Person.where(:age.gt => 18)

Person.where(:age.gte => 18)

Person.where(:title.in => ["Sir", "Madam"])

Person.where(:age.lt => 55)

Person.where(:age.lte => 55)

Person.where(:title.ne => "Mr")

Person.where(:title.nin => ["Esquire"])

Person.where(:aliases.size => 2)

Person.where(:location.near => [ 22.5, -21.33 ])

Person.where(:location.within => { "$center" => [ [ 50, -40 ], 1 ] })

Callbacks

before_create

before_destroy

before_save

before_update

before_validation

after_create

after_initialize

after_destroy

after_save

after_update

after_validation