Slide 1

Slide 1 text

Hands on with MongoDB Ruby & ^ Austin on Rails ˒ October 27, 2009 WYNNNETHERLAND Wednesday, October 28, 2009

Slide 2

Slide 2 text

Wednesday, October 28, 2009

Slide 3

Slide 3 text

No SQL? x x Wednesday, October 28, 2009

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

Tokyo Cabinet: Popular with Rubyists, Big in Japan Wednesday, October 28, 2009

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

More document-oriented solutions Wednesday, October 28, 2009

Slide 9

Slide 9 text

Wednesday, October 28, 2009

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Erlang + Javascript Wednesday, October 28, 2009

Slide 12

Slide 12 text

Map + reduce Wednesday, October 28, 2009

Slide 13

Slide 13 text

Very cool Wednesday, October 28, 2009

Slide 14

Slide 14 text

Plenty o’ Ruby to go around Wednesday, October 28, 2009

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Document stores: Throw out everything you learned about DB design almost* * more on this later Wednesday, October 28, 2009

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Wednesday, October 28, 2009

Slide 20

Slide 20 text

because this is BIG Wednesday, October 28, 2009

Slide 21

Slide 21 text

Wednesday, October 28, 2009

Slide 22

Slide 22 text

Runs like Hayes. Hits like Mays. Wednesday, October 28, 2009

Slide 23

Slide 23 text

MongoDB x Wednesday, October 28, 2009

Slide 24

Slide 24 text

Let's just skip to here already! x Wednesday, October 28, 2009

Slide 25

Slide 25 text

Introducing ★Built For Speed ★Dynamic Queries and Indexes ★Replication and Failover ★Sharding ★Map / Reduce can be very fast Wednesday, October 28, 2009

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Not as great for ★Highly transactional ★Ad-hoc business intelligence ★Problems requiring SQL Wednesday, October 28, 2009

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Some new terms Wednesday, October 28, 2009

Slide 31

Slide 31 text

When I say database Wednesday, October 28, 2009

Slide 32

Slide 32 text

When I say database think database Wednesday, October 28, 2009

Slide 33

Slide 33 text

Well that one isn't new... When I say database think database Wednesday, October 28, 2009

Slide 34

Slide 34 text

Databases in MongoDB ★Made up of multiple collections ★Are created on-the- y when rst referenced Wednesday, October 28, 2009

Slide 35

Slide 35 text

When I say collection Wednesday, October 28, 2009

Slide 36

Slide 36 text

When I say collection think table Wednesday, October 28, 2009

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

When I say document Wednesday, October 28, 2009

Slide 39

Slide 39 text

When I say document think record or row Wednesday, October 28, 2009

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

That looks like JSON Wednesday, October 28, 2009

Slide 45

Slide 45 text

So does this jason.to_json Wednesday, October 28, 2009

Slide 46

Slide 46 text

Where's the Ruby? Wednesday, October 28, 2009

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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