An Introduction
to Mongodb
and Mongoid
What is it?
A database really good at storing documents
NoSQL 
Differs from traditional DB's
Does not have relationships
JSON like structures with dynamic schema
Why?
Dont we have enough DBs already?
Designed to be
- Fast
- Scalable
- Flexible
Interacting with Mongo
Enter the console
 #mongoJavascript Interpreter
Lets check out a demo
Mongoid
Ruby ORM for mongodb
API familiar to ruby developers
Similar to ActiveRecord and Datamapper
Mongo Community
It has Solid documentation at 
http://mongoid.org
An active irc at #mongoid
Also a Mailing List at http://groups.google.com/group/mongoid
Railties
Generators for models
Hooks into ActiveModel
Validations
validates_associated :episodes validates :episodes, associated: truevalidates_format_of :title, with: /\A\w+\Z/ validates :title, format: { with: /\A\w+\Z/ }
Mass Assignment
# Set the field values in the document. Person.new(first_name: "Jean-Baptiste", middle_name: "Emmanuel") person.attributes = { first_name: "Jean-Baptiste", middle_name: "Emmanuel" }person.write_attributes( first_name: "Jean-Baptiste", middle_name: "Emmanuel" )
Serialization
 class Foo
  include Mongoid::Document
  field :bar
end
 
foo = Foo.new(:bar => "baz")
foo.to_json # => { bar: "baz" }Scopes
class User
  scope :active, :status => 'active'
  scope :over, :lambda { |age| where(:age.gt => age) }
end
User.where(:name => /^J/).active.over(40)callbacks
 class Article
  include Mongoid::Document
  field :name, type: String
  field :body, type: String
  field :slug, type: String
  before_create :send_message
  after_save do |document|
    # Handle callback here.
  end
  protected
  def send_message
    # Message sending code here.
  end
endTimestamps
class Person include Mongoid::Document include Mongoid::Timestamps end//This adds basic behavior for created_at and updated_at fields.
Framework Agnostic
Works with Sinatra and Padrino
 Alongside other ORMS like ActiveRecord and Datamapper
 Powerful Query Language
Familar to ActiveRecord users
AREL like syntax
User.where(:name => "John")
User.all(:age.lt => 24, :age.gt => 18)
User.where(:title.in => %w(Ms Mrs))Named Scopes
class User scope :active, :status => 'active' scope :over, :lambda { |age| where(:age.gt => age) } endUser.where(:name => /^J/).active.over(40)
GEOSPACIAL INDEXES
class Spot include Mongoid::Document field :name, :type => String field :latlng, :type => Array index [[:latlng, Mongo::GEO2D]] endRuby Spot.create( :name => "Majoran Distillery", :latlng => [41.910973,-87.635544] )Spot.where(:latlng.near => majoran.latlng) #=> [“Majoran Distillery”, ”Cibo”, “Westpac” ]Bar.where(:likes.gt => 100).geo_near([ 50, 12 ]).spherical
Apps thats USe Mongodb
Locomotive CMS
 Shapado a Q&A style site
Graylog2 for sorting server logs.
Sample App Demo
TV Guide
...
MongoDB and Mongoid
By Kieran Andrews
MongoDB and Mongoid
- 1,736
 
  