Tame Accidental Complexity with Ruby and MongoMapper
Upcoming SlideShare
Loading in...5
×
 

Tame Accidental Complexity with Ruby and MongoMapper

on

  • 3,120 views

Gentle introduction to MongoDb with Ruby and MongoMapper

Gentle introduction to MongoDb with Ruby and MongoMapper

Statistics

Views

Total Views
3,120
Views on SlideShare
3,102
Embed Views
18

Actions

Likes
2
Downloads
19
Comments
2

3 Embeds 18

http://blog.mikamai.com 11
http://paper.li 6
https://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

12 of 2

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • Great presentation.

    Many thanks,

    Atish
    Are you sure you want to
    Your message goes here
    Processing…
  • ESCUELA COLOMBIANA DE CARRERAS INDUSTRIALES


    JOHANA ROCIO BERNAL NOCUA
    CODIGO 2010181422
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Tame Accidental Complexity with Ruby and MongoMapper Tame Accidental Complexity with Ruby and MongoMapper Presentation Transcript

    • Tame accidental complexity Introduction to NoSQL with MongoMapperGiordano Scalzo
    • I’m not here to talk about performance
    • I’m not here to talk about scalability
    • but I’m here to talk about simplicity
    • Rails has been a first step
    • Anatomy of a Rails Application
    • Anatomy of a Rails Applicationview
    • Anatomy of a Rails Applicationview controller
    • Anatomy of a Rails Applicationview controller model
    • Different languageshtml+css view controller model
    • Different languageshtml+css oop view controller model
    • Different languageshtml+css oop sql view controller model
    • Impedance mismatchhtml+css oop sql view controller model
    • Origin of SqlSQLFrom Wikipedia, the free encyclopediaSQL (...), is a database computer languagedesigned for managing data in relationaldatabase management systems (RDBMS)
    • Origin of SqlSQLFrom Wikipedia, the free encyclopediaSQL (...), is a database computer languagedesigned for managing data in relationaldatabase management systems (RDBMS)
    • We need persistent objects!
    • We need persistent objects!class User def initialize(username, password) @username = username @password = password endend
    • We need persistent objects! { username: "giordano", password: "123" }
    • ActiveRecord tries its best
    • We need something different
    • Persistence
    • Persistenceclass User include MongoMapper::Documentend
    • Persistenceclass User include MongoMapper::Documentenduser = User.create({ :username => "giordano", :password => "123"})user.save
    • Persistenceclass User include MongoMapper::Documentenduser = User.create({ :username => "giordano", :password => "123"})user.saveputs User.all.last.to_mongo
    • Persistence{ "_id"=>BSON::ObjectId(4d643a274d8ff683dd000001), "username"=>"giordano", "password"=>"123"}
    • Types
    • Typesclass User include MongoMapper::Document key :username, String key :password , Stringend
    • Built-in TypesArray, Binary, Boolean, Date,Float, Hash, Integer, Nil,ObjectId, Set, String, Time
    • Custom Typesclass DowncasedString def self.to_mongo(value) value.nil? ? nil : value.to_s.downcase end def self.from_mongo(value) value.nil? ? nil : value.to_s.downcase endend
    • Custom Typesclass User include MongoMapper::Document key :username, String key :password , String key :email, DowncasedStringend
    • Custom Typesuser = User.newuser.username = "giordano"user.password = "123"user.email = "Giordano.Scalzo@CleanCode.it"user.saveputs User.all.last.to_mongo
    • Custom Types{ "_id"=>BSON::ObjectId(4d6442d94d8ff684d3000001), "username"=>"giordano", "password"=>"123", "email"=>"giordano.scalzo@cleancode.it"}
    • Embedded Documents
    • Embedded Documentsclass Task include MongoMapper::EmbeddedDocument key :description, String key :pomodori, Integer key :is_done, Booleanend
    • Embedded Documentsclass User include MongoMapper::Document key :username, String key :password , String key :email, DowncasedString many :tasksend
    • Embedded Documentsuser.tasks << Task.new({ description: refactor server, pomodori: 8, is_done: false})user.tasks << Task.new({ description: timer sound, pomodori: 2, is_done: false})
    • Embedded Documents{"_id"=>BSON::ObjectId(4d6575e84d8ff692e6000001), "username"=>"giordano", "password"=>"123", "email"=>"giordano.scalzo@cleancode.it", "tasks"=>[{ "_id"=>BSON::ObjectId(4d6575e84d8ff692e6000002), "description"=>"refactor server", "pomodori"=>8, "is_done"=>false }, { "_id"=>BSON::ObjectId(4d6575e84d8ff692e6000003), "description"=>"timer sound", "pomodori"=>2, "is_done"=>false }]}
    • Embedded Documents{"_id"=>BSON::ObjectId(4d6575e84d8ff692e6000001), "username"=>"giordano", "password"=>"123", "email"=>"giordano.scalzo@cleancode.it", "tasks"=>[{ "_id"=>BSON::ObjectId(4d6575e84d8ff692e6000002), "description"=>"refactor server", "pomodori"=>8, "is_done"=>false }, { "_id"=>BSON::ObjectId(4d6575e84d8ff692e6000003), "description"=>"timer sound", "pomodori"=>2, "is_done"=>false }]}
    • Documentsclass Task include MongoMapper::Document key :description, String key :pomodori, Integer key :is_done, Booleanend
    • Documentsp User.all.last.to_mongo{ "_id"=>BSON::ObjectId(4d657e924d8ff6949c000001), "username"=>"giordano", "password"=>"123", "email"=>"giordano.scalzo@cleancode.it"}
    • Documentsp User.all.last.tasks[#<Task _id: BSON::ObjectId(4d65822b4d8ff69542000002), description: "refactor server", pomodori: 8, is_done: false, user_id: BSON::ObjectId(4d65822b4d8ff69542000001) >, #<Task _id: BSON::ObjectId(4d65822b4d8ff69542000003), description: "timer sound", pomodori: 2, is_done: false, user_id: BSON::ObjectId(4d65822b4d8ff69542000001) >]
    • Validations & Callbacks
    • Validations & Callbacksclass User include MongoMapper::Document key :username, String, validates_presence_of :username key :password, String validates_presence_of :passwordend
    • Validations & Callbacksclass User include MongoMapper::Document key :username, String, :required => true key :password, String, :required => trueend
    • Validations & Callbacksvalidates_presence_ofvalidates_length_ofvalidates_format_ofvalidates_numericality_ofvalidates_acceptance_ofvalidates_confirmation_ofvalidates_inclusion_ofvalidates_exclusion_of
    • Validations & Callbacksbefore_save after_savebefore_create after_createbefore_update after_updatebefore_validation after_validationbefore_validation_on_create after_validation_on_createbefore_validation_on_update after_validation_on_updatebefore_destroy after_destroyvalidate_on_create validate_on_updatevalidate
    • Validations & Callbacksforked in current gem 0.8.6using Rails3 ActiveModel inRails3 branch just merged
    • What about querying?
    • What about querying?query = User.where(:last_name.exists => true, :created_at.gte => from_date, :created_at.lt => Time.now) Plucky: ActiveRecord-like language .skip(0).limit(5)query.all
    • What about querying?query = User.where(:last_name.exists => true, :created_at.gte => from_date, :created_at.lt => Time.now) Plucky: ActiveRecord-like language .skip(0).limit(5)#<Plucky::Query created_at: { "$gte"=>"1", "$lt"=>2011-02-24 10:54:36 UTC}, last_name: {"$exists"=>true}, limit: 5, skip: 0>
    • What about querying?query = User.where(:last_name.exists => true) .where(:created_at.gte => from_date) .where(:created_at.lt => Time.now) Plucky: ActiveRecord-like language .skip(0).limit(5)#<Plucky::Query created_at: { "$gte"=>"1", "$lt"=>2011-02-24 10:54:36 UTC}, last_name: {"$exists"=>true}, limit: 5, skip: 0>
    • What about plugins?
    • What about plugins?Accessible ModifiersAssociations PaginationCaching PersistenceCallbacks ProtectedClone QueryingDirty RailsDocument SafeDynamic Querying SingleEmbeddedDocument CollectionEquality InheritanceIdentityMap ScopesIndexes SerializationInspect TimestampsKeys UserstampsLogger Validations
    • Itʼs just a beginning
    • http://mongomapper.com/documentation/
    • http://mongoid.org/
    • giordano.scalzo@cleancode.it@giordanoscalzowww.slideshare.net/giordanogithub.com/gscalzo