39
Simple MongoDB design for Web (Rails) apps Sérgio Santos @sdsantos Improve Coimbra

Simple MongoDB design for Rails apps

Embed Size (px)

DESCRIPTION

Introduction to MongoDB, Rails Mongoid ORM and some data modelling examples.

Citation preview

Page 1: Simple MongoDB design for Rails apps

Simple MongoDB design for Web (Rails) apps

Sérgio Santos@sdsantos

Improve Coimbra

Page 2: Simple MongoDB design for Rails apps

Introduction / Disclamer

Page 3: Simple MongoDB design for Rails apps

Bundlr MongoDB stats

MongoDB from the start

~ 3½ years of development

~ 6 GB of data

~ 6 million documents

Cloud hosted on MongoHQ

Page 4: Simple MongoDB design for Rails apps

Burocracia MongoDB stats~ 3 weekends of development

~ 300MB of data

~ 721 documents

~ 400KB per document

Cloud hosted on MongoLab

Page 5: Simple MongoDB design for Rails apps

Why MongoDB?

Page 6: Simple MongoDB design for Rails apps

MongoDB 101

Page 7: Simple MongoDB design for Rails apps

Documents

Page 8: Simple MongoDB design for Rails apps

Collections

Page 9: Simple MongoDB design for Rails apps

References

Page 10: Simple MongoDB design for Rails apps

Embeds

Page 11: Simple MongoDB design for Rails apps

Rails MongoDB ORMs

Page 12: Simple MongoDB design for Rails apps

Mongoid vs MongoMapper

Page 13: Simple MongoDB design for Rails apps

Mongoid

Page 14: Simple MongoDB design for Rails apps

Modelsclass Person include Mongoid::Documentend

person = Person.newperson[:name] = 'Sérgio'person[:age] = 26person.save

Page 15: Simple MongoDB design for Rails apps

Modelsclass Person include Mongoid::Document field :name, type: String field :age, type: Integerend

person = Person.newperson.name = 'Sérgio'person.age = 26person.save

Page 16: Simple MongoDB design for Rails apps

Persistenceperson = Person.create(name: 'Sérgio', age: 26)

person.update_attributes(name: 'Sérgio Santos')

person.touch

person.delete

person.destroy

person.rename(:name, :first_name)

Page 17: Simple MongoDB design for Rails apps

Queryingperson = Person.find("4baa56f1230048567300485c")

people = Person.where(age: 18)

people = Person.where(name: 'Sérgio').not(age: 26)

Person.count

Person.all.avg(:age)

-- INSERT MAP/REDUCE CLEVER EXAMPLE HERE --

Page 18: Simple MongoDB design for Rails apps

Referencesclass Band include Mongoid::Document has_many :membersend

class Member include Mongoid::Document field :name, type: String belongs_to :bandend

Page 19: Simple MongoDB design for Rails apps

References# The parent band document.{ "_id" : ObjectId("4d3ed089fb60ab534684b7e9")}

# The child member document. { "_id" : ObjectId("4d3ed089fb60ab534684b7f1"), "name" : "Matt Berninger" "band_id" : ObjectId("4d3ed089fb60ab534684b7e9")}

Page 20: Simple MongoDB design for Rails apps

Embedsclass Band include Mongoid::Document embeds_many :albumsend

class Album include Mongoid::Document field :name, type: String embedded_in :bandend

Page 21: Simple MongoDB design for Rails apps

Embeds{ "_id" : ObjectId("4d3ed089fb60ab534684b7e9"), "albums" : [ { "_id" : ObjectId("4d3ed089fb60ab534684b7e0"), "name" : "Boxer", } ]}

Page 22: Simple MongoDB design for Rails apps

Extras

timestamps

identity map & cache

paranoia

versioning

Page 23: Simple MongoDB design for Rails apps

Cloud Hosting

Page 24: Simple MongoDB design for Rails apps
Page 25: Simple MongoDB design for Rails apps

The Nice Stuff

Page 26: Simple MongoDB design for Rails apps

No need to create the collection

class Band include Mongoid::Documentend

Page 27: Simple MongoDB design for Rails apps

Store anythingclass ParamsStore include Mongoid::Documentend

class ApplicationController < ActionController::Base before_filter do Stuff.create(params) endend

Page 28: Simple MongoDB design for Rails apps

Store long stuffclass Website include Mongoid::Document field :html, type: String field :css, type: String field :javascript, type: String embeds_many :imagesend

class Image include Mongoid::Document field :size, type: Integer field :file, type: Moped::BSON::Binary embedded_in :websiteend

Page 29: Simple MongoDB design for Rails apps

Geoclass Person include Mongoid::Document field :location, :type => Array index( { location: Mongo::GEO2D }, { min: -180, max: 180 } )end

coimbra_location = [20, -8]Person.geo_near(coimbra_location).spherical

Page 30: Simple MongoDB design for Rails apps

Full text searchclass Document include Mongoid::Document field :content, :type => String index( {:content => 'text'}, {:default_language => 'portuguese’} )end

Document.text_search('IKEA')

Page 31: Simple MongoDB design for Rails apps

Caveats (not so nice)No joins

Impact of key length

No integrity checks for references

Document size limit of 16MB

Nesting depth limit of 100

Page 32: Simple MongoDB design for Rails apps

( Bundlr ) Examples

Page 33: Simple MongoDB design for Rails apps

Settingsclass User include Mongoid::Document embeds_one :settingsend

class Settings include Mongoid:Document field :receive_emails, type: Boolean field :theme, type: Symbol embedded_in :userend

Page 34: Simple MongoDB design for Rails apps

Oauthsclass User include Mongoid::Document embeds_many :oauths index [["oauths.provider", Mongo::ASCENDING], ["oauths.uid", Mongo::ASCENDING]]end

class Oauth include Mongoid:Document field :provider, type: String field :token, type: String field :secret, type: String field :uid, type: String embedded_in :userend

Page 35: Simple MongoDB design for Rails apps

Activity Streamclass Activity include Mongoid::Document include Mongoid::Timestamps

field :verb, :type => Symbol field :actor, :type => Hash field :object, :type => Hash field :target, :type => Hash field :receivers, :type => Array embeds_many :likesend

Page 36: Simple MongoDB design for Rails apps

Relationshipsclass User include Mongoid::Document has_and_belongs_to_many :followers, :class_name => "User", :inverse_of => :followed_usersend

{ _id: ObjectId("4d541f6823380f670d000008"), follower_ids: [ ObjectId("4d4ea8ec86d56d2907000003"), ObjectId("50fe17c226c1b7000200018a") ],}

Need smarter relationships? Embed them!

Page 37: Simple MongoDB design for Rails apps

Other examples

Model hierarchy

Migrations

Changing schema?

No right way of doing things… is all about

context!

Page 38: Simple MongoDB design for Rails apps

Wrapping up…

Page 39: Simple MongoDB design for Rails apps

Sérgio Santos@sdsantos

[email protected]

Simple MongoDB design for Web (Rails) apps

Improve Coimbra