Tame Accidental Complexity with Ruby and MongoMapper

3,663
-1

Published on

Gentle introduction to MongoDb with Ruby and MongoMapper

2 Comments
2 Likes
Statistics
Notes
  • Great presentation.

    Many thanks,

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


    JOHANA ROCIO BERNAL NOCUA
    CODIGO 2010181422
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
3,663
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
22
Comments
2
Likes
2
Embeds 0
No embeds

No notes for slide

Tame Accidental Complexity with Ruby and MongoMapper

  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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×