Published on

10 Minute presentation to sdruby on mongodb and mongomapper

Published in: Education, Technology


  1. 1. MongoDB Getting started, Couch, and MongoMapper
  2. 2. Who am I? • Scott Motte / 25 / Perris, CA • mid-level rubyist that prefers merb • • • •
  3. 3. Leopard Install (0.9.7) • mkdir -p /data/db • wget osx-i386-0.9.7.tgz • sudo tar xvzf mongodb-osx-i386-0.9.7.tgz -C /usr/local • sudo cp -R /usr/local/mongodb-osx-i386-0.9.7/bin/ /usr/ local/bin
  4. 4. Linux Install (0.9.7) • mkdir -p /data/db • wget linux-x86_64-0.9.6.tgz • sudo tar -zxvf mongodb-linux-x86_64-0.9.7.tgz -C /usr/ local • sudo chmod 755 -R /usr/local/mongodb-linux- x86_64-0.9.7 • sudo cp -R /usr/local/mongodb-linux-x86_64-0.9.7/bin/* / usr/local/bin
  5. 5. Running it • sudo mongod run & • mongo (mysql-like command line) • use bookstore_development •{ title: "Ender's Game", description: 'zero gravity and mind games' }) • db.books.findOne()
  6. 6. Mongo or Couch Mongodb (C++) Couchdb (Erlang) drivers REST bson, document, schema-free json, document, schema-free Dynamic queries, indexing map/reduce gridfs attachments (needs an apache/nginx module) RAM http cache Good at the web, faster Good at the web, slower development time development time Update in place (good for high MVCC (fault tolerant, but requires update rates) compacting) master-master replication 50s kid indy kid *
  7. 7. Mongodb orms Ruby Python mongo-ruby-driver mongo-python-driver sudo gem install mongodb-mongo easy_install pymongo (c extension auto- sudo gem install mongodb-mongo_ext (c installed) extension) active-record-adapter autumn mongorecord mongo-mapper mongomapper
  8. 8. MongoMapper sudo gem install mongomapper config.gem 'jnunemaker-mongomapper' #rails dependency 'jnunemaker-mongomapper' #merb
  9. 9. Model class Book include MongoMapper::Document key :title, String key :description, String end
  10. 10. Controller class Books < Application def index @books = Book.all display @books end def show(id) @book = Book.find(id) raise NotFound unless @book display @book end ...
  11. 11. Validations class Book include MongoMapper::Document key :title, String key :description, String validates_presence_of :title #validates_numericality_of #validates_length_of #validates_format_of #more end *
  12. 12. Callbacks class Book .. key :description, String before_save :append_signature def append_signature self.description << " ~Corner Bookstore" end #after_save #before_validation end *
  13. 13. Relationships class Book include MongoMapper::Document key :title, String key :description, String has_many :reviews end class Review include MongoMapper::Document key :author, String key :review, String belongs_to :book end
  14. 14. Relationships cont. Finding @book = Book.first @reviews = Displaying @reviews.each do |review| end @reviews[0] # return first review Be careful @user.tweets.size #slow Tweet.count(:user_id => #fast
  15. 15. Embedded Documents class Review include MongoMapper::EmbeddedDocument key :uuid, String, :default => key :author, String key :review, String key :created_at, Time, :default => before_validation do self.uuid = end end *
  16. 16. Embedded Docs cont. class Reviews < Application .. def create(review) @flight = Flight.find(params['flight_id']) @review = if @review.valid? && << @review && redirect '/wherever’' :message => {:notice => "Review made"} else message[:error] = "Review fail" render :new end end end # in router.rb resources :flights, :identify => :id do resources :reviews, :identify => :uuid end # /flights/:flight_id/comments/new
  17. 17. Additional info • created_at and updated_at are included automatically by MongoMapper • _id cannot currently be set with MongoMapper like it can in Couchrest • cannot currently do @doc[‘custom_field’] like in couchrest. • indexing: @doc.ensure_index :login
  18. 18. Conclusion Mongodb is a great trade off of speed, features, and schema-less freedom, and it now has its developer friendly orm - mongomapper. Strongly consider using it in a web app you otherwise by default would use mysql. Then put together your models and use script/server or bin/merb -i to test your performance improvements. ~ Scott Motte