SlideShare a Scribd company logo
Using MongoDB with Ruby on Rails	
presented by Ryan Fischer, Founder of 20spokes
What is covered

• Why we use MongoDB and Ruby on Rails


• Choices made for Object Mapper


• Simple to get started!
Using MongoDB with Ruby on Rails

• Fast in-place updates with atomic modifiers


• Ruby on Rails is productive!


• Object Mappers available for MongoDB


• Mongo Ruby Driver
Mobile / Web

• Ruby on Rails makes REST easy, making APIs easier.


• Render responses as text, JSON, or XML


• Geospatial indexing for location based queries.


• Location-centric websites and mobile applications.
Why we chose MongoDB

• Cowrite - collaborative writing web application


   • Versioning needed


   • Originally using GridFS


• Travel720 - Gift registry web site


   • Self contained relations can take advantage of embedding documents
Mongo Object Mappers for Ruby	

• MongoMapper


• Mongoid


• Mongo ODM


• MongoModel
Why we chose Mongoid

• Excellent documentation


• Active community


• Compatibility with other projects/gems


• Similar API to ActiveRecord


• Uses ActiveValidation


• Mongoid Extras: Caching, Paranoid Documents, Versioning, Timestamping,
  Composite Keys
Compatible Gems with Mongoid	

• Devise - Authentication solution for Rails based on Warden. Supports
  Mongoid out of box.


• Carrierwave - simple and flexible way to upload files from Ruby Applications.
  Supports grid_fs.


• Geocoder - complete geocoding solution for Rails. Adds geocoding by street
  or IP address, reverse geocoding, and distance queries.


• Mongoid-rspec - RSpec matchers and macros for Mongoid.
Getting Started

Include in Gem file
 gem "mongoid", "~> 2.3"
 gem "bson_ext", "~> 1.4"


Run the install for Mongoid

 rails generate mongoid:config



That’s it!
mongoid.yml
development:
  host: localhost
  database: geekbusters_development

test:
  host: localhost
  database: geekbusters_test

production:
 host: <%= ENV['MONGOID_HOST'] %>
 port: <%= ENV['MONGOID_PORT'] %>
 username: <%= ENV['MONGOID_USERNAME'] %>
 password: <%= ENV['MONGOID_PASSWORD'] %>
 database: <%= ENV['MONGOID_DATABASE'] %>
  # slaves:
  #   - host: slave1.local
  #     port: 27018
  #   - host: slave2.local
  #     port: 27019
Developing with MongoDB/Mongoid

• Generating models is the same using the console as with ActiveRecord.


   • rails generate model Team name:string city:string
     location:array


• No migrations needed!


• Take advantage of embedded documents in models where applicable for
  increased performance.


• Store large files using GridFS
Fields available for Mongoid	

• Array                             • Range

• BigDecimal (Stored as a String)   • String

• Boolean                           • Symbol

• Date                              • Time

• DateTime

• Float

• Hash

• Integer
Mongoid Document

class Team
  include Mongoid::Document
  include Mongoid::Timestamps

  field :name, type: String
  field :city, type: String
  field :location, :type => Array

  validates :name, :city, :presence => true

end
Persisting in the Controller

def create
  Team.create(:city => "New York", :name => "Giants")
end


def update
  @team = Team.find(params[:id])
  @team = Team.update_attributes(params[:team])
end
Indexing
 class Team
   include Mongoid::Document

   field :name, type: String
   index :name, unique: true
 end

Indexing on multiple fields -

index(
  [
    [ :name, MONGO::ASCENDING ]
    [ :city, MONGO::ASCENDING ]
  ]
)
Indexing

To create indexes in the database use the rake task


   rake db:mongoid:create_indexes




Or configure to autocreate in mongoid.yml (not recommended)


    defaults: &defaults
      autocreate_indexes: true
Relations in Models

• Associations between models can be embedded or referenced


• NO JOINS!


• Objects that are referenced involve a separate query


• Embedded documents can be very efficient with reducing queries to one
  while managing the size of the document


• One to One, One to Many, and Many to Many relations available
Relations in Mongoid - Embedded

• Embedded Relations - stored inside other documents in the database.
 class Blog
   include Mongoid::Document
   embeds_many :posts
 end

 class Post
   include Mongoid::Document
   embedded_in :blog
 end
Embedded Posts


{ "_id" : ObjectId("4e9ba47fcdffba523f000004"),
  "name" : "Geekbusters Blog",
  "posts" :
  [
    {"content" : "Slimer is right behind you.",
      _id" : ObjectId("4e9ba47fcdffba523f000005")}
  ]
}
Polymorphic Behavior
class Image
  include Mongoid::Document
  embeds_many :comments, as: :commentable
end

class Document
  include Mongoid::Document
  embeds_many :comments, as: :commentable
end

class Comment
  include Mongoid::Document
  embedded_in :commentable, polymorphic: true
end
Relations in Mongoid - Referenced

Referenced Relations - stores reference to a document in another collection,
typically an id

class Blog
  include Mongoid::Document
  has_many :posts, dependent: :delete
end

class Post
  include Mongoid::Document
  belongs_to :blog
end
Many to Many Relationship

class Tag
  include Mongoid::Document
  has_and_belongs_to_many :posts
end

class Post
  include Mongoid::Document
  has_and_belongs_to_many :tags
end
Querying

• Queries are of type Criteria, which is a chainable and lazily evaluated wrapper
  to a MongoDB dynamic query.


• Chainable queries include:
    all_in         includes
    all_of         limit
    also_in        near
    and            not_in
    any_of         only
    asc            order_by
    desc           skip
    distinct       where
    excludes       without
Query Examples

Team.near(location: [20.70, 38.15]).limit(20)



Team.any_in(names: ["Giants", "Bears", "Lions"])



Team.find_or_create_by(name: "Giants")


Team.where(name: "Cowboys").destroy_all
Versioning with Mongoid	

• Embeds a version of the object on each save.


• Can skip versioning and also set the max versions.


• Add to model -



 include Mongoid::Versioning
Versioning Example
{"_id" : ObjectId("4e9ba7fdcdffba52d6000004"),
  "content" : "Impossible. I am too loud to fall asleep to.",
  "created_at" : ISODate("2011-10-17T03:58:53Z"),
  "title" : "Impossible to sleep to - this guy.",
  "updated_at" : ISODate("2011-10-17T03:58:53Z"),
  "version" : 3,
  "versions" : [
    {"title" : "Who is asleep?",
     "content" : "Wake up the guy next to you if they are asleep.
Thanks.",
     "version" : 1,
     "created_at" : ISODate("2011-10-17T03:58:53Z")},
    {"title" : "Who is asleep?",
     "content" : "Impossible. I am too loud to fall asleep to.",
     "created_at" : ISODate("2011-10-17T03:58:53Z"),
     "version" : 2 } ]
}
And More

• Identity Map


• Callbacks


• Scopes


• Dirty Tracking
Testing Rails with MongoDB

• RSpec-Mongoid provides test matchers


• RSpec does not refresh the database with each test run.


• Database Cleaner to the rescue. It be setup to truncate a database before
  running tests. Add below after installing the DatabaseCleaner Gem.

 config.before(:suite) do
   DatabaseCleaner.strategy = :truncation
   DatabaseCleaner.orm = "mongoid"
 end
Hosting Options

• Heroku is a widely used cloud hosting for Ruby on Rails


• MongoHQ and MongoLab both have add on options


• Options and pricing are similar
Thanks!!

Email: ryan.fischer@20spokes.com

Twitter: @ryanfischer20

Check out Geekbusters on Github
Ad

Recommended

Rehosting apps between k8s clusters and automating deployment using crane
Rehosting apps between k8s clusters and automating deployment using crane
Konveyor Community
 
React Native and React JS Advantages, Disadvantages and Features.pptx
React Native and React JS Advantages, Disadvantages and Features.pptx
InnvonixTechSolution
 
Online Railway reservation
Online Railway reservation
Oyindrila Bhattacharya
 
Better APIs with GraphQL
Better APIs with GraphQL
Josh Price
 
Authenticating Angular Apps with JWT
Authenticating Angular Apps with JWT
Jennifer Estrada
 
RESTful API 설계
RESTful API 설계
Jinho Yoo
 
hbaseconasia2019 HBCK2: Concepts, trends, and recipes for fixing issues in HB...
hbaseconasia2019 HBCK2: Concepts, trends, and recipes for fixing issues in HB...
Michael Stack
 
CouchDB
CouchDB
Rashmi Agale
 
Www and http
Www and http
SanthiNivas
 
REST API and CRUD
REST API and CRUD
Prem Sanil
 
Client Side MVC & Angular
Client Side MVC & Angular
Alexe Bogdan
 
RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개
Wonchang Song
 
Migrating Apache Hive Workload to Apache Spark: Bridge the Gap with Zhan Zhan...
Migrating Apache Hive Workload to Apache Spark: Bridge the Gap with Zhan Zhan...
Databricks
 
angular fundamentals.pdf angular fundamentals.pdf
angular fundamentals.pdf angular fundamentals.pdf
NuttavutThongjor1
 
Semantic web meetup – sparql tutorial
Semantic web meetup – sparql tutorial
AdonisDamian
 
SPIN in Five Slides
SPIN in Five Slides
Holger Knublauch
 
CouchDB
CouchDB
Jacob Diamond
 
Rest api and-crud-api
Rest api and-crud-api
F(x) Data Labs Pvt Ltd
 
Build microservice with gRPC in golang
Build microservice with gRPC in golang
Ting-Li Chou
 
Mongoid in the real world
Mongoid in the real world
Kevin Faustino
 
Rails Loves MongoDB
Rails Loves MongoDB
BillWatts
 
Simple MongoDB design for Rails apps
Simple MongoDB design for Rails apps
Sérgio Santos
 
MongoDB & Mongoid with Rails
MongoDB & Mongoid with Rails
Justin Smestad
 
Mongodb mongoid
Mongodb mongoid
Marcos Vanetta
 
Using Mongoid with Ruby on Rails
Using Mongoid with Ruby on Rails
Nicholas Altobelli
 
From Zero to Mongo, Art.sy Experience w/ MongoDB
From Zero to Mongo, Art.sy Experience w/ MongoDB
Daniel Doubrovkine
 
Mongodb
Mongodb
Scott Motte
 
Rails with MongoDB - RORLab 47th
Rails with MongoDB - RORLab 47th
Eugene Park
 
Build your first MongoDB App in Ruby @ StrangeLoop 2013
Build your first MongoDB App in Ruby @ StrangeLoop 2013
Steven Francia
 
Grzegorz Witek - MongoDB + RoR, Mongoid (PRUG 1.0)
Grzegorz Witek - MongoDB + RoR, Mongoid (PRUG 1.0)
ecommerce poland expo
 

More Related Content

What's hot (11)

Www and http
Www and http
SanthiNivas
 
REST API and CRUD
REST API and CRUD
Prem Sanil
 
Client Side MVC & Angular
Client Side MVC & Angular
Alexe Bogdan
 
RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개
Wonchang Song
 
Migrating Apache Hive Workload to Apache Spark: Bridge the Gap with Zhan Zhan...
Migrating Apache Hive Workload to Apache Spark: Bridge the Gap with Zhan Zhan...
Databricks
 
angular fundamentals.pdf angular fundamentals.pdf
angular fundamentals.pdf angular fundamentals.pdf
NuttavutThongjor1
 
Semantic web meetup – sparql tutorial
Semantic web meetup – sparql tutorial
AdonisDamian
 
SPIN in Five Slides
SPIN in Five Slides
Holger Knublauch
 
CouchDB
CouchDB
Jacob Diamond
 
Rest api and-crud-api
Rest api and-crud-api
F(x) Data Labs Pvt Ltd
 
Build microservice with gRPC in golang
Build microservice with gRPC in golang
Ting-Li Chou
 
REST API and CRUD
REST API and CRUD
Prem Sanil
 
Client Side MVC & Angular
Client Side MVC & Angular
Alexe Bogdan
 
RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개
Wonchang Song
 
Migrating Apache Hive Workload to Apache Spark: Bridge the Gap with Zhan Zhan...
Migrating Apache Hive Workload to Apache Spark: Bridge the Gap with Zhan Zhan...
Databricks
 
angular fundamentals.pdf angular fundamentals.pdf
angular fundamentals.pdf angular fundamentals.pdf
NuttavutThongjor1
 
Semantic web meetup – sparql tutorial
Semantic web meetup – sparql tutorial
AdonisDamian
 
Build microservice with gRPC in golang
Build microservice with gRPC in golang
Ting-Li Chou
 

Similar to MongoDB and Ruby on Rails (20)

Mongoid in the real world
Mongoid in the real world
Kevin Faustino
 
Rails Loves MongoDB
Rails Loves MongoDB
BillWatts
 
Simple MongoDB design for Rails apps
Simple MongoDB design for Rails apps
Sérgio Santos
 
MongoDB & Mongoid with Rails
MongoDB & Mongoid with Rails
Justin Smestad
 
Mongodb mongoid
Mongodb mongoid
Marcos Vanetta
 
Using Mongoid with Ruby on Rails
Using Mongoid with Ruby on Rails
Nicholas Altobelli
 
From Zero to Mongo, Art.sy Experience w/ MongoDB
From Zero to Mongo, Art.sy Experience w/ MongoDB
Daniel Doubrovkine
 
Mongodb
Mongodb
Scott Motte
 
Rails with MongoDB - RORLab 47th
Rails with MongoDB - RORLab 47th
Eugene Park
 
Build your first MongoDB App in Ruby @ StrangeLoop 2013
Build your first MongoDB App in Ruby @ StrangeLoop 2013
Steven Francia
 
Grzegorz Witek - MongoDB + RoR, Mongoid (PRUG 1.0)
Grzegorz Witek - MongoDB + RoR, Mongoid (PRUG 1.0)
ecommerce poland expo
 
MongoDB at FrozenRails
MongoDB at FrozenRails
Mike Dirolf
 
Webinar: Getting Started with Ruby and MongoDB
Webinar: Getting Started with Ruby and MongoDB
MongoDB
 
MongoDB at RubyEnRails 2009
MongoDB at RubyEnRails 2009
Mike Dirolf
 
Battle of NoSQL stars: Amazon's SDB vs MongoDB vs CouchDB vs RavenDB
Battle of NoSQL stars: Amazon's SDB vs MongoDB vs CouchDB vs RavenDB
Jesse Wolgamott
 
Using Mongomapper to store dynamic data
Using Mongomapper to store dynamic data
wonko
 
FrozenRails Training
FrozenRails Training
Mike Dirolf
 
MongoDB at ZPUGDC
MongoDB at ZPUGDC
Mike Dirolf
 
Practical Ruby Projects With Mongo Db
Practical Ruby Projects With Mongo Db
Alex Sharp
 
Rails + mongo db
Rails + mongo db
Sérgio Santos
 
Mongoid in the real world
Mongoid in the real world
Kevin Faustino
 
Rails Loves MongoDB
Rails Loves MongoDB
BillWatts
 
Simple MongoDB design for Rails apps
Simple MongoDB design for Rails apps
Sérgio Santos
 
MongoDB & Mongoid with Rails
MongoDB & Mongoid with Rails
Justin Smestad
 
Using Mongoid with Ruby on Rails
Using Mongoid with Ruby on Rails
Nicholas Altobelli
 
From Zero to Mongo, Art.sy Experience w/ MongoDB
From Zero to Mongo, Art.sy Experience w/ MongoDB
Daniel Doubrovkine
 
Rails with MongoDB - RORLab 47th
Rails with MongoDB - RORLab 47th
Eugene Park
 
Build your first MongoDB App in Ruby @ StrangeLoop 2013
Build your first MongoDB App in Ruby @ StrangeLoop 2013
Steven Francia
 
Grzegorz Witek - MongoDB + RoR, Mongoid (PRUG 1.0)
Grzegorz Witek - MongoDB + RoR, Mongoid (PRUG 1.0)
ecommerce poland expo
 
MongoDB at FrozenRails
MongoDB at FrozenRails
Mike Dirolf
 
Webinar: Getting Started with Ruby and MongoDB
Webinar: Getting Started with Ruby and MongoDB
MongoDB
 
MongoDB at RubyEnRails 2009
MongoDB at RubyEnRails 2009
Mike Dirolf
 
Battle of NoSQL stars: Amazon's SDB vs MongoDB vs CouchDB vs RavenDB
Battle of NoSQL stars: Amazon's SDB vs MongoDB vs CouchDB vs RavenDB
Jesse Wolgamott
 
Using Mongomapper to store dynamic data
Using Mongomapper to store dynamic data
wonko
 
FrozenRails Training
FrozenRails Training
Mike Dirolf
 
MongoDB at ZPUGDC
MongoDB at ZPUGDC
Mike Dirolf
 
Practical Ruby Projects With Mongo Db
Practical Ruby Projects With Mongo Db
Alex Sharp
 
Ad

Recently uploaded (20)

“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
Edge AI and Vision Alliance
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
 
Down the Rabbit Hole – Solving 5 Training Roadblocks
Down the Rabbit Hole – Solving 5 Training Roadblocks
Rustici Software
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
Providing an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME Flow
Safe Software
 
Murdledescargadarkweb.pdfvolumen1 100 elementary
Murdledescargadarkweb.pdfvolumen1 100 elementary
JorgeSemperteguiMont
 
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
Edge AI and Vision Alliance
 
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
Safe Software
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Alliance
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
SAP Modernization Strategies for a Successful S/4HANA Journey.pdf
SAP Modernization Strategies for a Successful S/4HANA Journey.pdf
Precisely
 
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Safe Software
 
June Patch Tuesday
June Patch Tuesday
Ivanti
 
Supporting the NextGen 911 Digital Transformation with FME
Supporting the NextGen 911 Digital Transformation with FME
Safe Software
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
Edge AI and Vision Alliance
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
 
Down the Rabbit Hole – Solving 5 Training Roadblocks
Down the Rabbit Hole – Solving 5 Training Roadblocks
Rustici Software
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
Providing an OGC API Processes REST Interface for FME Flow
Providing an OGC API Processes REST Interface for FME Flow
Safe Software
 
Murdledescargadarkweb.pdfvolumen1 100 elementary
Murdledescargadarkweb.pdfvolumen1 100 elementary
JorgeSemperteguiMont
 
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
Edge AI and Vision Alliance
 
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
Safe Software
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Alliance
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
SAP Modernization Strategies for a Successful S/4HANA Journey.pdf
SAP Modernization Strategies for a Successful S/4HANA Journey.pdf
Precisely
 
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Safe Software
 
June Patch Tuesday
June Patch Tuesday
Ivanti
 
Supporting the NextGen 911 Digital Transformation with FME
Supporting the NextGen 911 Digital Transformation with FME
Safe Software
 
Ad

MongoDB and Ruby on Rails

  • 1. Using MongoDB with Ruby on Rails presented by Ryan Fischer, Founder of 20spokes
  • 2. What is covered • Why we use MongoDB and Ruby on Rails • Choices made for Object Mapper • Simple to get started!
  • 3. Using MongoDB with Ruby on Rails • Fast in-place updates with atomic modifiers • Ruby on Rails is productive! • Object Mappers available for MongoDB • Mongo Ruby Driver
  • 4. Mobile / Web • Ruby on Rails makes REST easy, making APIs easier. • Render responses as text, JSON, or XML • Geospatial indexing for location based queries. • Location-centric websites and mobile applications.
  • 5. Why we chose MongoDB • Cowrite - collaborative writing web application • Versioning needed • Originally using GridFS • Travel720 - Gift registry web site • Self contained relations can take advantage of embedding documents
  • 6. Mongo Object Mappers for Ruby • MongoMapper • Mongoid • Mongo ODM • MongoModel
  • 7. Why we chose Mongoid • Excellent documentation • Active community • Compatibility with other projects/gems • Similar API to ActiveRecord • Uses ActiveValidation • Mongoid Extras: Caching, Paranoid Documents, Versioning, Timestamping, Composite Keys
  • 8. Compatible Gems with Mongoid • Devise - Authentication solution for Rails based on Warden. Supports Mongoid out of box. • Carrierwave - simple and flexible way to upload files from Ruby Applications. Supports grid_fs. • Geocoder - complete geocoding solution for Rails. Adds geocoding by street or IP address, reverse geocoding, and distance queries. • Mongoid-rspec - RSpec matchers and macros for Mongoid.
  • 9. Getting Started Include in Gem file gem "mongoid", "~> 2.3" gem "bson_ext", "~> 1.4" Run the install for Mongoid rails generate mongoid:config That’s it!
  • 10. mongoid.yml development: host: localhost database: geekbusters_development test: host: localhost database: geekbusters_test production: host: <%= ENV['MONGOID_HOST'] %> port: <%= ENV['MONGOID_PORT'] %> username: <%= ENV['MONGOID_USERNAME'] %> password: <%= ENV['MONGOID_PASSWORD'] %> database: <%= ENV['MONGOID_DATABASE'] %> # slaves: # - host: slave1.local # port: 27018 # - host: slave2.local # port: 27019
  • 11. Developing with MongoDB/Mongoid • Generating models is the same using the console as with ActiveRecord. • rails generate model Team name:string city:string location:array • No migrations needed! • Take advantage of embedded documents in models where applicable for increased performance. • Store large files using GridFS
  • 12. Fields available for Mongoid • Array • Range • BigDecimal (Stored as a String) • String • Boolean • Symbol • Date • Time • DateTime • Float • Hash • Integer
  • 13. Mongoid Document class Team include Mongoid::Document include Mongoid::Timestamps field :name, type: String field :city, type: String field :location, :type => Array validates :name, :city, :presence => true end
  • 14. Persisting in the Controller def create Team.create(:city => "New York", :name => "Giants") end def update @team = Team.find(params[:id]) @team = Team.update_attributes(params[:team]) end
  • 15. Indexing class Team include Mongoid::Document field :name, type: String index :name, unique: true end Indexing on multiple fields - index( [ [ :name, MONGO::ASCENDING ] [ :city, MONGO::ASCENDING ] ] )
  • 16. Indexing To create indexes in the database use the rake task rake db:mongoid:create_indexes Or configure to autocreate in mongoid.yml (not recommended) defaults: &defaults autocreate_indexes: true
  • 17. Relations in Models • Associations between models can be embedded or referenced • NO JOINS! • Objects that are referenced involve a separate query • Embedded documents can be very efficient with reducing queries to one while managing the size of the document • One to One, One to Many, and Many to Many relations available
  • 18. Relations in Mongoid - Embedded • Embedded Relations - stored inside other documents in the database. class Blog include Mongoid::Document embeds_many :posts end class Post include Mongoid::Document embedded_in :blog end
  • 19. Embedded Posts { "_id" : ObjectId("4e9ba47fcdffba523f000004"), "name" : "Geekbusters Blog", "posts" : [ {"content" : "Slimer is right behind you.", _id" : ObjectId("4e9ba47fcdffba523f000005")} ] }
  • 20. Polymorphic Behavior class Image include Mongoid::Document embeds_many :comments, as: :commentable end class Document include Mongoid::Document embeds_many :comments, as: :commentable end class Comment include Mongoid::Document embedded_in :commentable, polymorphic: true end
  • 21. Relations in Mongoid - Referenced Referenced Relations - stores reference to a document in another collection, typically an id class Blog include Mongoid::Document has_many :posts, dependent: :delete end class Post include Mongoid::Document belongs_to :blog end
  • 22. Many to Many Relationship class Tag include Mongoid::Document has_and_belongs_to_many :posts end class Post include Mongoid::Document has_and_belongs_to_many :tags end
  • 23. Querying • Queries are of type Criteria, which is a chainable and lazily evaluated wrapper to a MongoDB dynamic query. • Chainable queries include: all_in includes all_of limit also_in near and not_in any_of only asc order_by desc skip distinct where excludes without
  • 24. Query Examples Team.near(location: [20.70, 38.15]).limit(20) Team.any_in(names: ["Giants", "Bears", "Lions"]) Team.find_or_create_by(name: "Giants") Team.where(name: "Cowboys").destroy_all
  • 25. Versioning with Mongoid • Embeds a version of the object on each save. • Can skip versioning and also set the max versions. • Add to model - include Mongoid::Versioning
  • 26. Versioning Example {"_id" : ObjectId("4e9ba7fdcdffba52d6000004"), "content" : "Impossible. I am too loud to fall asleep to.", "created_at" : ISODate("2011-10-17T03:58:53Z"), "title" : "Impossible to sleep to - this guy.", "updated_at" : ISODate("2011-10-17T03:58:53Z"), "version" : 3, "versions" : [ {"title" : "Who is asleep?", "content" : "Wake up the guy next to you if they are asleep. Thanks.", "version" : 1, "created_at" : ISODate("2011-10-17T03:58:53Z")}, {"title" : "Who is asleep?", "content" : "Impossible. I am too loud to fall asleep to.", "created_at" : ISODate("2011-10-17T03:58:53Z"), "version" : 2 } ] }
  • 27. And More • Identity Map • Callbacks • Scopes • Dirty Tracking
  • 28. Testing Rails with MongoDB • RSpec-Mongoid provides test matchers • RSpec does not refresh the database with each test run. • Database Cleaner to the rescue. It be setup to truncate a database before running tests. Add below after installing the DatabaseCleaner Gem. config.before(:suite) do DatabaseCleaner.strategy = :truncation DatabaseCleaner.orm = "mongoid" end
  • 29. Hosting Options • Heroku is a widely used cloud hosting for Ruby on Rails • MongoHQ and MongoLab both have add on options • Options and pricing are similar