hands on with ruby & mongodb
DESCRIPTION
Slides from talk at Austin on Rails on using MongoDB with Ruby.TRANSCRIPT
Hands on with MongoDBRuby &
^
Austin on Rails ★ October 27, 2009
WYNNNETHERLAND
Wednesday, October 28, 2009
Wednesday, October 28, 2009
No SQL?x
x
Wednesday, October 28, 2009
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
Key value stores
Project VoldemortRingoScalarisKaiDynomiteMemcacheDBThruDBCouchDBCassandraHBaseHypertableRedisTokyo Cabinet/Tyrant
http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/
Some very coolprojects in this space
Wednesday, October 28, 2009
Tokyo Cabinet: Popular with Rubyists, Big in Japan
Wednesday, October 28, 2009
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
More document-oriented solutions
Wednesday, October 28, 2009
Wednesday, October 28, 2009
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
Erlang + Javascript
Wednesday, October 28, 2009
Map + reduce
Wednesday, October 28, 2009
Very cool
Wednesday, October 28, 2009
Plenty o’ Ruby to go around
Wednesday, October 28, 2009
Ruby libraries for CouchDB
CouchRest Basic model RelaxDB CouchPotato CouchFoo ActiveCouch
http://www.slideshare.net/brianthecoder/couchdb
From theAustin on Rails talk
Wednesday, October 28, 2009
Document stores:Throw out everything
you learned about DB design
almost*
Wednesday, October 28, 2009
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.pdfhttp://damienkatz.net/files/What is CouchDB.pdf
Wednesday, October 28, 2009
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.pdfhttp://damienkatz.net/files/What is CouchDB.pdf
The devil's in the details
Wednesday, October 28, 2009
Wednesday, October 28, 2009
because this is BIG
Wednesday, October 28, 2009
Wednesday, October 28, 2009
Runs like Hayes.Hits like Mays.
Wednesday, October 28, 2009
MongoDB x
Wednesday, October 28, 2009
Let's just skip to here already!
x
Wednesday, October 28, 2009
Introducing
★Built For Speed★Dynamic Queries and Indexes★Replication and Failover★Sharding★Map / Reduce
can be very fast
Wednesday, October 28, 2009
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
Not as great for
★Highly transactional
★Ad-hoc business intelligence
★Problems requiring SQL
Wednesday, October 28, 2009
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
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
Some new terms
Wednesday, October 28, 2009
When I saydatabase
Wednesday, October 28, 2009
When I saydatabase
thinkdatabase
Wednesday, October 28, 2009
Well that one isn't new...
When I saydatabase
thinkdatabase
Wednesday, October 28, 2009
Databases in MongoDB
★Made up of multiple collections
★Are created on-the-!y when "rst referenced
Wednesday, October 28, 2009
When I saycollection
Wednesday, October 28, 2009
When I saycollection
thinktable
Wednesday, October 28, 2009
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
When I saydocument
Wednesday, October 28, 2009
When I saydocument
thinkrecord or row
Wednesday, October 28, 2009
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
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
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
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
That looks like JSON
Wednesday, October 28, 2009
So does this
jason.to_json
Wednesday, October 28, 2009
Where's the Ruby?
Wednesday, October 28, 2009
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
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
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
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
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
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
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 :articlesend
class Address include MongoMapper::Document key :street, String key :city, String key :state, String, :length => 2 key :zip, Integer, :numeric => true, :length => 5end
Included as module, not subclassed (this may change soon).
Wednesday, October 28, 2009
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
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
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
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
Resources
http://mongodb.orghttp://www.10gen.com http://groups.google.com/group/mongomapperhttp://groups.google.com/group/mongodb-userhttp://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