Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hands on with Ruby and MongoDB

Hands on with Ruby and MongoDB

Wynn Netherland

September 17, 2011
Tweet

More Decks by Wynn Netherland

Other Decks in Programming

Transcript

  1. Hands on with MongoDB Ruby & ^ Austin on Rails

    ˒ October 27, 2009 WYNNNETHERLAND Wednesday, October 28, 2009
  2. When does NOSQL make sense? ★Your data is stored and

    retrieved mainly by primary key, without complex joins. ★You have a non-trivial amount of data, and the thought of managing lots of RDBMS shards and replication failure scenarios gives you the fear. http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/ Wednesday, October 28, 2009
  3. Key value stores Project Voldemort Ringo Scalaris Kai Dynomite MemcacheDB

    ThruDB CouchDB Cassandra HBase Hypertable Redis Tokyo Cabinet/Tyrant http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/ Some very cool projects in this space Wednesday, October 28, 2009
  4. Tokyo Cabinet: Popular with Rubyists, Big in Japan ★Lightning fast

    ★Works best for at objects ★Tokyo Tyrant for network access http://www.igvita.com/2009/02/13/tokyo-cabinet-beyond-key-value-store/ Wednesday, October 28, 2009
  5. CouchDB Apache CouchDB is a distributed, fault-tolerant and schema-free document-oriented

    database accessible via a RESTful HTTP/JSON API. http://couchdb.apache.org/ Wednesday, October 28, 2009
  6. Ruby libraries for CouchDB CouchRest Basic model RelaxDB CouchPotato CouchFoo

    ActiveCouch http://www.slideshare.net/brianthecoder/couchdb From the Austin on Rails talk Wednesday, October 28, 2009
  7. Document stores: Throw out everything you learned about DB design

    almost* * more on this later Wednesday, October 28, 2009
  8. SQL CouchDB Prede ned, explicit schema Dynamic, implicit schema Uniform

    tables of data Collection of named documents with varying structure Normalized. Objects spread across tables. Duplication reduced. Denormalized. Docs usually self contained. Data often duplicated. Must know schema to read/write a complete object Must know only document name Dynamic queries of static schemas Static queries of dynamic schemas http://damienkatz.net/files/What is CouchDB.pdf http://damienkatz.net/files/What is CouchDB.pdf Wednesday, October 28, 2009
  9. SQL CouchDB Prede ned, explicit schema Dynamic, implicit schema Uniform

    tables of data Collection of named documents with varying structure Normalized. Objects spread across tables. Duplication reduced. Denormalized. Docs usually self contained. Data often duplicated. Must know schema to read/write a complete object Must know only document name Dynamic queries of static schemas Static queries of dynamic schemas http://damienkatz.net/files/What is CouchDB.pdf http://damienkatz.net/files/What is CouchDB.pdf The devil's in the details Wednesday, October 28, 2009
  10. Introducing ★Built For Speed ★Dynamic Queries and Indexes ★Replication and

    Failover ★Sharding ★Map / Reduce can be very fast Wednesday, October 28, 2009
  11. MongoDB is great for ★Websites ★Caching ★High volume, low value

    ★High scalability ★Storage of program objects and JSON stash the hash Wednesday, October 28, 2009
  12. Installation ★mkdir -p /data/db ★download pre-built for OSX and unzip

    to /usr/local/ ★cp -R /usr/local/pathtomongo/bin /usr/local/bin ★sudo gem install mongo ★sudo gem install mongo_ext ★sudo gem install mongo_mapper Native C extensions ( go turbo! ) Ruby driver for MongoDB Wednesday, October 28, 2009
  13. Contents of mongo/bin ★mongod - The MongoDB server ★mongo -

    the JavaScript interactive shell ★mongoexport - export data as JSON or csv ★mongoimport - As advertised ★mongodump - Like mysqldump ★mongorestore - Restore from mongodump les ★mongos - Auto-sharding module (getting better with every build) what's in the box? why? What did you think it was? Wednesday, October 28, 2009
  14. Well that one isn't new... When I say database think

    database Wednesday, October 28, 2009
  15. Databases in MongoDB ★Made up of multiple collections ★Are created

    on-the- y when rst referenced Wednesday, October 28, 2009
  16. Collections in MongoDB ★Schema-less ★For grouping documents into smaller query

    sets (speed) ★Indexable by one or more key ★Are created on-the- y when rst referenced ★Capped collections: Fixed size, older records dropped after limit reached but typed! Wednesday, October 28, 2009
  17. Document ★Stored in a collection ★Can have _id key that

    works like primary keys in MySQL ★Supports relationships: subdocument or db reference Wednesday, October 28, 2009
  18. Document Storage (BSON) { author: 'joe', created: Date('03-28-2009'), title: 'Yet

    another blog post', text: 'Here is the text...', tags: [ 'example', 'joe' ], comments: [ { author: 'jim', comment: 'I disagree' }, { author: 'nancy', comment: 'Good post' } ] } http://www.mongodb.org/display/DOCS/BSON Wednesday, October 28, 2009
  19. Document Storage (BSON) { author: 'joe', created: Date('03-28-2009'), title: 'Yet

    another blog post', text: 'Here is the text...', tags: [ 'example', 'joe' ], comments: [ { author: 'jim', comment: 'I disagree' }, { author: 'nancy', comment: 'Good post' } ] } http://www.mongodb.org/display/DOCS/BSON Sure wish JSON did this... Wednesday, October 28, 2009
  20. Document Storage (BSON) { author: 'joe', created: Date('03-28-2009'), title: 'Yet

    another blog post', text: 'Here is the text...', tags: [ 'example', 'joe' ], comments: [ { author: 'jim', comment: 'I disagree' }, { author: 'nancy', comment: 'Good post' } ] } http://www.mongodb.org/display/DOCS/BSON Sure wish JSON did this... B is for Binary Wednesday, October 28, 2009
  21. Querying db.collection.find({'first_name': 'John'}) # finds all Johns db.collection.find({'first_name': /^wynn/i}) #

    regex db.collection.find_first({'_id':1}) # finds first with _id of 1 db.collection.find({'age': {'$gte': 21}}) # finds possible drinkers db.collection.find({'author.first_name':'John'}) # subdocument db.collection.find({$where:'this.age >= 6 && this.age <= 18'}) Wednesday, October 28, 2009
  22. Querying $in, $nin, $all, $ne, $gt, $gte, $lt, $lte, $size,

    $where :fields (like :select in active record) :limit, :offset for pagination :sort ascending or descending [['foo', 1], ['bar', -1]] count and group (uses map/reduce) db.collection.mapReduce(mapfunction,reducefunction[,options]); More Wednesday, October 28, 2009
  23. 10 Gen projects on the hub ★mongo-ruby-driver http://github.com/mongodb/mongo-ruby- driver ★mongorecord

    http://github.com/mongodb/mongo-activerecord- ruby Wednesday, October 28, 2009
  24. MongoMapper ★Mongo is not MySQL ★DSL for modeling domain should

    also teach you Mongo ★It sounded fun ★Just released version 0.5.6 from @jnunemaker Wednesday, October 28, 2009
  25. MongoMapper ★Mongo is not MySQL ★DSL for modeling domain should

    also teach you Mongo ★It sounded fun ★Just released version 0.5.6 from @jnunemaker I voted for "Nunemapper" Wednesday, October 28, 2009
  26. Features ★Typecasting ★Callbacks (ActiveSupport Callbacks) ★Validations ★Connection and database can

    differ per document ★Create and Update with single or multiple ★Delete and Destroy and _all counterparts ★Find: id, ids, :all, : rst, :last ★Associations Be careful. Ordering can be tricky. Wednesday, October 28, 2009
  27. Example class User include MongoMapper::Document key :name, String, :required =>

    true, :length => 5..100 key :email, String, :required => true, :index => true key :age, Integer, :numeric => true key :active, Boolean, :default => true one :address many :articles end class Address include MongoMapper::Document key :street, String key :city, String key :state, String, :length => 2 key :zip, Integer, :numeric => true, :length => 5 end Included as module, not subclassed (this may change soon). Wednesday, October 28, 2009
  28. MongoDB fun ★Capped collections (think memcache, actually used for replication)

    ★Upserts db.collection.update({'_id':1}, {'$inc': {'views':1}}) ★Multikeys (think tagging and full text search) ★GridFS and auto-sharding Wednesday, October 28, 2009
  29. So, is it ready for Prime Time? ★Disqus ★SourceForge ★TweetCongress,

    GovTwit -- Floxee.com ★TweetSaver.com ★Mozilla Ubiquity Herd Ask these folks! Wednesday, October 28, 2009
  30. Lessons learned in production ★The laws of computing are still

    in effect ★Indexes are important no matter what the salesman told ya about performance ★Data modeling. Deep or Wide? ★MongoDB and MongoMapper are in active development the fine print The answer is yes! Very responsive yet very volatile changes! Wednesday, October 28, 2009
  31. How can you help? ★We need an awesome admin GUI

    ★Port some plugins (might get easier with ActiveModel support coming soon) ★Build something cool Wednesday, October 28, 2009
  32. Resources http://mongodb.org http://www.10gen.com http://groups.google.com/group/mongomapper http://groups.google.com/group/mongodb-user http://squeejee.com http://wynnnetherland.com and thanks for

    having me! Questions? I'm @pengwynn on Twitter the very new blog the very cool company behind MongoDB Wednesday, October 28, 2009