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_nameendString以外は型を指定 Array, BigDecimal, Boolean, Date, DateTime, Float, Hash, Integer, String, Symbol, Time Validationも使える Create person = Person.create(:first_name => "Syd", :last_name => "Vicious")Save person = Person.new(:first_name => "Syd", :last_name => "Vicious")person.save # or person.upsertsaveは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.destroyperson.delete ##deleteはcallback(before_destroyとか)を無視する。Find色々 Person.all(:conditions => { :first_name => "Syd" })Person.find(:all, :conditions => { :first_name => "Syd" })Person.first(:conditions => { :first_name => "Syd" }) ## 見つからなければnilPerson.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").countPerson.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) ## offsetPerson.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 ] })before_createbefore_destroybefore_savebefore_updatebefore_validationafter_createafter_initializeafter_destroyafter_saveafter_updateafter_validation |
