Tame Accidental Complexity with Ruby and MongoMapper

  • 2,858 views
Uploaded on

Gentle introduction to MongoDb with Ruby and MongoMapper

Gentle introduction to MongoDb with Ruby and MongoMapper

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

    Many thanks,

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


    JOHANA ROCIO BERNAL NOCUA
    CODIGO 2010181422
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
2,858
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
20
Comments
2
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Tame accidental complexity Introduction to NoSQL with MongoMapperGiordano Scalzo
  • 2. I’m not here to talk about performance
  • 3. I’m not here to talk about scalability
  • 4. but I’m here to talk about simplicity
  • 5. Rails has been a first step
  • 6. Anatomy of a Rails Application
  • 7. Anatomy of a Rails Applicationview
  • 8. Anatomy of a Rails Applicationview controller
  • 9. Anatomy of a Rails Applicationview controller model
  • 10. Different languageshtml+css view controller model
  • 11. Different languageshtml+css oop view controller model
  • 12. Different languageshtml+css oop sql view controller model
  • 13. Impedance mismatchhtml+css oop sql view controller model
  • 14. Origin of SqlSQLFrom Wikipedia, the free encyclopediaSQL (...), is a database computer languagedesigned for managing data in relationaldatabase management systems (RDBMS)
  • 15. Origin of SqlSQLFrom Wikipedia, the free encyclopediaSQL (...), is a database computer languagedesigned for managing data in relationaldatabase management systems (RDBMS)
  • 16. We need persistent objects!
  • 17. We need persistent objects!class User def initialize(username, password) @username = username @password = password endend
  • 18. We need persistent objects! { username: "giordano", password: "123" }
  • 19. ActiveRecord tries its best
  • 20. We need something different
  • 21. Persistence
  • 22. Persistenceclass User include MongoMapper::Documentend
  • 23. Persistenceclass User include MongoMapper::Documentenduser = User.create({ :username => "giordano", :password => "123"})user.save
  • 24. Persistenceclass User include MongoMapper::Documentenduser = User.create({ :username => "giordano", :password => "123"})user.saveputs User.all.last.to_mongo
  • 25. Persistence{ "_id"=>BSON::ObjectId(4d643a274d8ff683dd000001), "username"=>"giordano", "password"=>"123"}
  • 26. Types
  • 27. Typesclass User include MongoMapper::Document key :username, String key :password , Stringend
  • 28. Built-in TypesArray, Binary, Boolean, Date,Float, Hash, Integer, Nil,ObjectId, Set, String, Time
  • 29. 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
  • 30. Custom Typesclass User include MongoMapper::Document key :username, String key :password , String key :email, DowncasedStringend
  • 31. Custom Typesuser = User.newuser.username = "giordano"user.password = "123"user.email = "Giordano.Scalzo@CleanCode.it"user.saveputs User.all.last.to_mongo
  • 32. Custom Types{ "_id"=>BSON::ObjectId(4d6442d94d8ff684d3000001), "username"=>"giordano", "password"=>"123", "email"=>"giordano.scalzo@cleancode.it"}
  • 33. Embedded Documents
  • 34. Embedded Documentsclass Task include MongoMapper::EmbeddedDocument key :description, String key :pomodori, Integer key :is_done, Booleanend
  • 35. Embedded Documentsclass User include MongoMapper::Document key :username, String key :password , String key :email, DowncasedString many :tasksend
  • 36. 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})
  • 37. 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 }]}
  • 38. 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 }]}
  • 39. Documentsclass Task include MongoMapper::Document key :description, String key :pomodori, Integer key :is_done, Booleanend
  • 40. Documentsp User.all.last.to_mongo{ "_id"=>BSON::ObjectId(4d657e924d8ff6949c000001), "username"=>"giordano", "password"=>"123", "email"=>"giordano.scalzo@cleancode.it"}
  • 41. 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) >]
  • 42. Validations & Callbacks
  • 43. Validations & Callbacksclass User include MongoMapper::Document key :username, String, validates_presence_of :username key :password, String validates_presence_of :passwordend
  • 44. Validations & Callbacksclass User include MongoMapper::Document key :username, String, :required => true key :password, String, :required => trueend
  • 45. Validations & Callbacksvalidates_presence_ofvalidates_length_ofvalidates_format_ofvalidates_numericality_ofvalidates_acceptance_ofvalidates_confirmation_ofvalidates_inclusion_ofvalidates_exclusion_of
  • 46. 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
  • 47. Validations & Callbacksforked in current gem 0.8.6using Rails3 ActiveModel inRails3 branch just merged
  • 48. What about querying?
  • 49. 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
  • 50. 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>
  • 51. 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>
  • 52. What about plugins?
  • 53. What about plugins?Accessible ModifiersAssociations PaginationCaching PersistenceCallbacks ProtectedClone QueryingDirty RailsDocument SafeDynamic Querying SingleEmbeddedDocument CollectionEquality InheritanceIdentityMap ScopesIndexes SerializationInspect TimestampsKeys UserstampsLogger Validations
  • 54. Itʼs just a beginning
  • 55. http://mongomapper.com/documentation/
  • 56. http://mongoid.org/
  • 57. giordano.scalzo@cleancode.it@giordanoscalzowww.slideshare.net/giordanogithub.com/gscalzo