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
#mongo
Javascript 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: true
validates_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
end
Timestamps
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) } end
User.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]] end
Ruby 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,616