Your SlideShare is downloading. ×
MongoDB is the MashupDB
Upcoming SlideShare
Loading in...5

Thanks for flagging this SlideShare!

Oops! An error has occurred.


Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

MongoDB is the MashupDB


Published on

My slides from MongoAustin 2011

My slides from MongoAustin 2011

Published in: Technology

  • Be the first to comment

No Downloads
Total Views
On Slideshare
From Embeds
Number of Embeds
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

No notes for slide


  • 1. Stash the Hash!MongoDB is the MashupDB Mongo Austin February 15, 2011 WYNNNETHERLAND
  • 2. whoami
  • 3. +
  • 4. Two years ago...
  • 5. x No SQL? x
  • 6. MongoDB x
  • 7. Lets just skip to here already!x
  • 8. One year ago
  • 9. CTO of AmazonNoSQL Smackdown!
  • 10. Today
  • 11. is it web scale?
  • 12. x
  • 13. How do we get to here? xx
  • 14. Enlightenment
  • 15. Almost ^ Two years with
  • 16. Our journey
  • 17.
  • 18. “We the Tweeple of the UnitedStates, in order to form a moreperfect government, establishcommunication, and promotetransparency do hereby tweet theCongress of the United States ofAmerica.”
  • 19. and aggregator ^The idea: A Twitter directory for the US Congress
  • 20. 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.
  • 21. Key value stores Project Voldemort me ver y cool Ringo Scalaris So space Kai ojects in this Dynomite MemcacheDB pr ThruDB CouchDB Cassandra HBase Hypertable Redis Tokyo Cabinet/Tyrant Riak Neo4J
  • 22. Tokyo Cabinet
  • 23. CouchDBApache CouchDB is a distributed, fault-tolerant andschema-free document-oriented database accessible viaa RESTful HTTP/JSON API.
  • 24. SQL CouchDB Prede ned, explicit schema Dynamic, implicit schema Collection of named documents with varying Uniform tables of data structure Normalized. Objects spread across tables. Denormalized. Docs usually self contained. Data Duplication reduced. often duplicated. Must know schema to read/write a complete Must know only document name object Dynamic queries of static schemas Static queries of dynamic schemas is CouchDB.pdf is CouchDB.pdf
  • 25. SQL CouchDB Prede ned, explicit schema Dynamic, implicit schema Collection of named documents with varying Uniform tables of data structure Normalized. Objects spread across tables. Duplication reduced. TheDenormalized. Docs usually selfdetails devilsoften duplicated.contained. Data in the Must know schema to read/write a complete Must know only document name object Dynamic queries of static schemas Static queries of dynamic schemas is CouchDB.pdf is CouchDB.pdf
  • 26. why I
  • 27. Mongo speaks JSON
  • 28. Document Storage (BSON) B is for Binary { 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 } ] } Sure wish JSON did this...
  • 29. That looks like JSON
  • 30. versatility
  • 31. Runs like Hayes.Hits like Mays.
  • 32. Introducing★ Built For Speedcan be very fast★ Dynamic Queries and Indexes★ Replication and Failover★ Sharding★ Map / Reduce★ Geospatial stuffs
  • 33. MongoDB is great for ★ Websites Your own queryable API mirror ★ Caching ★ High volume, low value ★ High scalability stash the hash ★ Storage of program objects and JSON
  • 34. Not as great for ★ Highly transactional ★ Financial stuffs ★ Problems requiring SQL
  • 35. Installation ★ mkdir -p /data/db ★ download pre-built for OSX and unzip to /usr/local/ ★ cp -R /usr/local/pathtomongo/bin /usr/local/bin Ruby driver for MongoDB ★ gem install mongo Native C ★ gem install mongo_ext extensions ( go turbo! ) ★ gem install mongo_mapper
  • 36. brew install mongodb
  • 37. Contents of mongo/bin whats in the box? ★ mongod - The MongoDB server ★ mongo - the JavaScript interactive shell ★ mongoexport - export data as JSON or csv ★ mongoimport - As advertised was? ★ mongodump - Like mysqldump why? What did you think it ★ mongorestore - Restore from mongodump les ★ mongos - Auto-sharding module (getting better with every build)
  • 38. Some new terms
  • 39. When I say think database database Well that one isnt new...
  • 40. Databases in MongoDB ★ Made up of multiple collections ★ Are created on-the- y when rst referenced
  • 41. When I say think collection table
  • 42. Collections in MongoDB ★ Schema-less but typed! ★ 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
  • 43. When I say think document record or row
  • 44. The Ruby ecosystem
  • 45. The Ruby driver
  • 46. Queryingdb.collection.find({first_name: John}) # finds all Johnsdb.collection.find({first_name: /^wynn/i}) # regexdb.collection.find_first({_id:1}) # finds first with _id of 1db.collection.find({age: {$gte: 21}}) # finds possible drinkersdb.collection.find({author.first_name:John}) # subdocumentdb.collection.find({$where:this.age >= 6 && this.age <= 18})
  • 47. More 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]);
  • 48. Updating$inc, $set, $unset, $push, $pushAll, $addToSet,$pop, $pull, $pullAll, $rename, $bit
  • 49. akfast w it hB re Nune makerJohn
  • 50. MongoMapper from @jnunemaker ★ Mongo is not MySQL ★ DSL for modeling domain should also teach you Mongo ★ Now in version 0.8.6 I voted for "Nunemapper"
  • 51. 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 Be careful. Ordering can be tricky.★ Find: id, ids, :all, : rst, :last★ Associations
  • 52. Exampleclass 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 :articlesend Included as module, not subclassedclass Address include MongoMapper::Document key :street, String key :city, String key :state, String, :length => 2 key :zip, Integer, :numeric => true, :length => 5end
  • 53. QueriesUser.where( => 27).sort(:age).allUser.where( => 27).sort(:age.desc).allUser.where( => 27).sort(:age).limit(1).allUser.where( => 27).sort(:age).skip(1).limit(1).all
  • 54. Scopesclass User include MongoMapper::Document # plain old vanilla scopes with fancy queries scope :johns, where(:name => John) # plain old vanilla scopes with hashes scope :bills, :name => Bill # dynamic scopes with parameters scope :by_name, lambda { |name| where(:name => name) } scope :by_ages, lambda { |low, high| where(:age.gte => low, :age.lte => high) } # Yep, even plain old methods work as long as they return a query def self.by_tag(tag) where(:tags => tag) end # You can even make a method that returns a scope def self.twenties; by_ages(20, 29) end key :name, String key :tags, Arrayend
  • 55. Scopes# simple scopespp User.johns.firstpp User.bills.first# scope with argpp User.by_name(Frank).first# scope with two argspp User.by_ages(20, 29).all# chaining class methods on scopespp User.by_ages(20, 40).by_tag(ruby).all# scope made using method that returns scopepp User.twenties.all
  • 56. Mongoid
  • 57. Mongomatic
  • 58. Mongomaticrequire mongomatic class User < Mongomatic::Base  def validate    self.errors.add "name", "cant be empty" if self["name"].blank?    self.errors.add "email", "cant be empty" if self["email"].blank?  endend # set the db for all models:Mongomatic.db ="mongomatic_test")# or you can set it for a specific model:User.db ="mongomatic_test_user") 
  • 59. MongomaticUser.empty?=> trueu = => "Ben")=> #<user:0x00000100d0cbf8 @doc="{"name"=">"Ben"}, @removed=false>u.valid?=> falseu["email"] = ""u.valid?=> trueu.insert=> BSON::ObjectId(4c32834f0218236321000001) User.empty?=> false
  • 60. MongoDB is open source
  • 61. Mongo runs in the cloud
  • 62. #mongodb
  • 63. How can you help? ★ We need an awesome admin GUI ★ Port some plugins (might get easier with ActiveModel support coming soon) ★ Build something cool
  • 64. Lessons learned in production the fine print ★ The laws of computing are still in effect Upserts FTW! ★ Indexes are important no matter what the salesman told ya about performance ★ Data modeling. Deep or Wide? The answer is yes! ★ MongoDB and MongoMapper are in active development Very responsive yet very volatile changes!
  • 65. 10gen
  • 66. Get the backstory on
  • 67. Questions? @pengwynn