Upload
janmindmatters
View
1.482
Download
0
Embed Size (px)
DESCRIPTION
35 minutes of compressed knowledge on how to use mongodb from ruby.
Citation preview
on ruby
mongo berlin 2010
jan krutisch <[email protected]>http://jan.krutisch.de/
and rails
Donnerstag, 7. Oktober 2010
I
Donnerstag, 7. Oktober 2010
I
Web Developer
Donnerstag, 7. Oktober 2010
I
Web Developer
Donnerstag, 7. Oktober 2010
I
Web Developer
github.com/halfbyte
Donnerstag, 7. Oktober 2010
I
Web Developer
jan.krutisch.de
github.com/halfbyte
Donnerstag, 7. Oktober 2010
I
Web Developer
Tinkerer
jan.krutisch.de
github.com/halfbyte
Donnerstag, 7. Oktober 2010
I
Web Developer
Tinkerer
twitter.com/halfbyte
jan.krutisch.de
github.com/halfbyte
Donnerstag, 7. Oktober 2010
ruby
Donnerstag, 7. Oktober 2010
Find examples here:http://github.com/halfbyte/mongo_ruby_examples
Donnerstag, 7. Oktober 2010
Basic driver usage
Donnerstag, 7. Oktober 2010
gem install mongo bson_ext
Donnerstag, 7. Oktober 2010
init
Donnerstag, 7. Oktober 2010
getting connections
Donnerstag, 7. Oktober 2010
@connection = Mongo::Connection.new
Donnerstag, 7. Oktober 2010
@connection = Mongo::Connection.new( 'localhost', 27017, :pool_size => 5, :timeout => 20)
Donnerstag, 7. Oktober 2010
@connection = Mongo::Connection.from_uri( "mongodb://localhost:27017/test")
Donnerstag, 7. Oktober 2010
Choose a database.
Donnerstag, 7. Oktober 2010
@connection.database_names#=> ["admin", "local"]
Donnerstag, 7. Oktober 2010
@db = @connection['test']
Donnerstag, 7. Oktober 2010
@db = @connection.db('test')
Donnerstag, 7. Oktober 2010
collections
Donnerstag, 7. Oktober 2010
@collection = @db['books']
Donnerstag, 7. Oktober 2010
@collection = @db.collection('books')
Donnerstag, 7. Oktober 2010
subcollections
Donnerstag, 7. Oktober 2010
@collection = @db['books.reviews']
Donnerstag, 7. Oktober 2010
@collection = @db['books']['reviews']
Donnerstag, 7. Oktober 2010
C R U D
Donnerstag, 7. Oktober 2010
Create Read Update Delete
Donnerstag, 7. Oktober 2010
Create Read Update Delete
Donnerstag, 7. Oktober 2010
insert
Donnerstag, 7. Oktober 2010
doc = { :text => "You can observe a lot just by watching.", :from => "Yogi Berra", :created_at => Time.now}@db['quotes'].insert(doc)
Donnerstag, 7. Oktober 2010
doc = { :text => "You can observe a lot just by watching.", :from => "Yogi Berra", :created_at => Time.now}@db['quotes'].save(doc)
Donnerstag, 7. Oktober 2010
doc = { :text => "You can observe a lot just by watching.", :from => "Yogi Berra", :created_at => Time.now}@db['quotes'].save(doc)
Donnerstag, 7. Oktober 2010
safe (using getlasterror)
Donnerstag, 7. Oktober 2010
doc = { :text => "You can observe a lot just by watching.", :from => "Yogi Berra", :created_at => Time.now}@db['quotes'].save(doc, :safe => true)
Donnerstag, 7. Oktober 2010
doc = { :text => "You can observe a lot just by watching.", :from => "Yogi Berra", :created_at => Time.now}@db['quotes'].save(doc, :safe => true)
Donnerstag, 7. Oktober 2010
how about getting back an id?
Donnerstag, 7. Oktober 2010
doc = { :text => "You can observe a lot just by watching.", :from => "Yogi Berra", :created_at => Time.now}id = @db['quotes'].save(doc)
Donnerstag, 7. Oktober 2010
doc = { :text => "You can observe a lot just by watching.", :from => "Yogi Berra", :created_at => Time.now}id = @db['quotes'].save(doc)
Donnerstag, 7. Oktober 2010
Create Read Update Delete
Donnerstag, 7. Oktober 2010
Create Read Update Delete
Donnerstag, 7. Oktober 2010
Create Read Update Delete
Donnerstag, 7. Oktober 2010
upsert
Donnerstag, 7. Oktober 2010
doc = @db['quotes'].find_one(id)
doc[:from] = "Yogi Berra, famous baseball player"
@db['quotes'].save(doc)
Donnerstag, 7. Oktober 2010
Create Read Update Delete
Donnerstag, 7. Oktober 2010
Create Read Update Delete
Donnerstag, 7. Oktober 2010
@db['quotes'].update( {:_id => doc['_id']}, { :from => "Yogi Berra", :text => "You can observe a lot just by watching.", :tags => ['baseball', 'wit'] })
Donnerstag, 7. Oktober 2010
atomic updates
Donnerstag, 7. Oktober 2010
@db['quotes'].update( {"from" => "Yogi Berra"}, {"$inc" => {"reads" => 1 } })
Donnerstag, 7. Oktober 2010
@db['quotes'].update( {"from" => "Yogi Berra"}, {"$inc" => {"reads" => 1 } })
Donnerstag, 7. Oktober 2010
$inc$set$unset$push$pushAll
$addToSet$pop$pull$pullAll$
Donnerstag, 7. Oktober 2010
@db['people'].update( {"tags" => "cool"}, "$addToSet" => {"tags" => 'froody'}, :multi => true)
Donnerstag, 7. Oktober 2010
@db['people'].update( {"tags" => "cool"}, "$addToSet" => {"tags" => 'froody'}, :multi => true)
Donnerstag, 7. Oktober 2010
@db['people'].update( {"tags" => "cool"}, { "$addToSet" => { "tags" => { "$each" => ['froody', 'hoopy'] } } }, :safe => true, :multi => true)
Donnerstag, 7. Oktober 2010
@db['people'].update( {"tags" => "cool"}, { "$addToSet" => { "tags" => { "$each" => ['froody', 'hoopy'] } } }, :safe => true, :multi => true)
Donnerstag, 7. Oktober 2010
@db['people'].update( {"tags" => "cool"}, {"$set" => {"tags.$" => "fresh"}}, :safe => true, :multi => true)
Donnerstag, 7. Oktober 2010
@db['people'].update( {"tags" => "cool"}, {"$set" => {"tags.$" => "fresh"}}, :safe => true, :multi => true)
Donnerstag, 7. Oktober 2010
Create Read Update Delete
Donnerstag, 7. Oktober 2010
Create Read Update Delete
Donnerstag, 7. Oktober 2010
@db['people'].remove
Donnerstag, 7. Oktober 2010
@db['numbers'].remove( {"$lt" => 30}, :safe => true)
Donnerstag, 7. Oktober 2010
Create Read Update Delete
Donnerstag, 7. Oktober 2010
Create Read Update Delete
Donnerstag, 7. Oktober 2010
all
Donnerstag, 7. Oktober 2010
@db['quotes'].find.each do |row| puts row.inspectend
Donnerstag, 7. Oktober 2010
one
Donnerstag, 7. Oktober 2010
row = @db['quotes'].find_one
Donnerstag, 7. Oktober 2010
exact query
Donnerstag, 7. Oktober 2010
@db['quotes'].find(:from => "Yogi Berra")
Donnerstag, 7. Oktober 2010
more queries
Donnerstag, 7. Oktober 2010
100.times do |i| db['numbers'].insert({"i" => i})end
Donnerstag, 7. Oktober 2010
db['numbers'].find("i" => {"$lt" => 2})
Donnerstag, 7. Oktober 2010
$lt <$gt >$lte <=$gte >=$ne !=
Donnerstag, 7. Oktober 2010
@db['people'].find( :tags => { "$in" => ['cool', 'weird'] })
Donnerstag, 7. Oktober 2010
obj = { "_id"=>BSON::ObjectID('4c706af16261040680000369'), "name"=>"Vernon Kreiger", "address"=>{ "street"=>"536 Haleigh Locks", "city"=>"Port Kiannahaven", "zip"=>"80730-0214", "country"=>"Fakistan" }, "tags"=>["cool", "weird"]}
Donnerstag, 7. Oktober 2010
obj = { "_id"=>BSON::ObjectID('4c706af16261040680000369'), "name"=>"Vernon Kreiger", "address"=>{ "street"=>"536 Haleigh Locks", "city"=>"Port Kiannahaven", "zip"=>"80730-0214", "country"=>"Fakistan" }, "tags"=>["cool", "weird"]}
Donnerstag, 7. Oktober 2010
$in IN (2,3,4)$nin NOT IN$all [2,3] ~ [1,2,3]
Donnerstag, 7. Oktober 2010
$mod yah, RLY$size okay$exists NOT NULL$type huh?
Donnerstag, 7. Oktober 2010
Let‘s go deep.
Donnerstag, 7. Oktober 2010
@db['people'].find("address.city" => "Berlin")
Donnerstag, 7. Oktober 2010
@db['people'].find("address.city" => "Berlin")
Donnerstag, 7. Oktober 2010
/stand back/
Donnerstag, 7. Oktober 2010
@db['people'].find("address.city" => /haven/)
Donnerstag, 7. Oktober 2010
@db['people'].find("address.city" => /haven/)
Donnerstag, 7. Oktober 2010
I‘m in ur database, executin ur javascript
Donnerstag, 7. Oktober 2010
@db['numbers'].find("$where" => "this.i < 2")
Donnerstag, 7. Oktober 2010
boolsh
Donnerstag, 7. Oktober 2010
not
Donnerstag, 7. Oktober 2010
@db['numbers'].find( "i" => { "$not" => {"$lt" => 97} })
Donnerstag, 7. Oktober 2010
and
Donnerstag, 7. Oktober 2010
@db['numbers'].find( "i" => { "$lt" => 52, "$gt" => 48 })
Donnerstag, 7. Oktober 2010
or
Donnerstag, 7. Oktober 2010
@db['numbers'].find( "$or" => [ { "i" => { "$lt" => 2 } }, { "i" => { "$gt" => 97 } } ])
Donnerstag, 7. Oktober 2010
Sorting
Donnerstag, 7. Oktober 2010
@db['people'].find().sort("address.street")
Donnerstag, 7. Oktober 2010
@db['people'].find().sort("address.street")
Donnerstag, 7. Oktober 2010
@db['people'].find().sort("address.street")
Donnerstag, 7. Oktober 2010
@db['people'].find().sort("address.street")
Donnerstag, 7. Oktober 2010
@db['people'].find().sort("address.street", :asc)
Donnerstag, 7. Oktober 2010
@db['people'].find().sort("address.street", :asc)
Donnerstag, 7. Oktober 2010
@db['people'].find().sort( "address.street", Mongo::ASCENDING)
Donnerstag, 7. Oktober 2010
@db['people'].find().sort( "address.street", Mongo::ASCENDING)
Donnerstag, 7. Oktober 2010
Pagination
Donnerstag, 7. Oktober 2010
@db['numbers'].find.sort("i").limit(10)
Donnerstag, 7. Oktober 2010
@db['numbers'].find.sort("i").limit(10).skip(50)
Donnerstag, 7. Oktober 2010
Aggregation
Donnerstag, 7. Oktober 2010
Countin‘ Bizness
Donnerstag, 7. Oktober 2010
@db['numbers'].find.count
Donnerstag, 7. Oktober 2010
Distinct
Donnerstag, 7. Oktober 2010
@db['people'].distinct('tags')
Donnerstag, 7. Oktober 2010
Group
Donnerstag, 7. Oktober 2010
Poor mans map/reduce
Donnerstag, 7. Oktober 2010
@db['people'].group( ['created_at'], {}, {:tags => {}}, reduce, finalize)
Donnerstag, 7. Oktober 2010
@db['people'].group( ['created_at'], {}, {:tags => {}}, reduce, finalize)
Donnerstag, 7. Oktober 2010
@db['people'].group( ['created_at'], {}, {:tags => {}}, reduce, finalize)
Donnerstag, 7. Oktober 2010
@db['people'].group( ['created_at'], {}, {:tags => {}}, reduce, finalize)
Donnerstag, 7. Oktober 2010
@db['people'].group( ['created_at'], {}, {:tags => {}}, reduce, finalize)
Donnerstag, 7. Oktober 2010
function(doc, prev) { for(i in doc.tags) { if (doc.tags[i] in prev.tags) { prev.tags[doc.tags[i]]++ } else { prev.tags[doc.tags[i]] =1 } }}
Donnerstag, 7. Oktober 2010
{"created_at"=>2010-09-19 22:00:00 UTC, "tags"=>{"foo"=>11.0, "dumb"=>12.0, "stupid"=>7.0, "bar"=>7.0, "cool"=>14.0, "weird"=>17.0}}{"created_at"=>2010-09-20 22:00:00 UTC, "tags"=>{"dumb"=>11.0, "stupid"=>5.0, "foo"=>10.0, "cool"=>8.0, "weird"=>9.0, "bar"=>15.0}}{"created_at"=>2010-09-22 22:00:00 UTC, "tags"=>{"weird"=>15.0, "bar"=>9.0, "stupid"=>17.0, "cool"=>11.0, "dumb"=>10.0, "foo"=>12.0}}{"created_at"=>2010-09-15 22:00:00 UTC, "tags"=>{"foo"=>11.0, "weird"=>7.0, "stupid"=>10.0, "cool"=>11.0, "bar"=>5.0, "dumb"=>8.0}}{"created_at"=>2010-09-25 22:00:00 UTC, "tags"=>{"dumb"=>11.0, "weird"=>14.0, "cool"=>8.0, "foo"=>21.0, "bar"=>11.0, "stupid"=>13.0}}{"created_at"=>2010-09-28 22:00:00 UTC, "tags"=>{"cool"=>11.0, "dumb"=>16.0, "stupid"=>11.0, "weird"=>15.0, "foo"=>9.0, "bar"=>16.0}}{"created_at"=>2010-09-10 22:00:00 UTC, "tags"=>{"dumb"=>15.0, "weird"=>9.0, "bar"=>8.0, "cool"=>14.0, "stupid"=>11.0, "foo"=>11.0}}{"created_at"=>2010-09-03 22:00:00 UTC, "tags"=>{"weird"=>14.0, "dumb"=>15.0, "stupid"=>11.0, "foo"=>16.0, "bar"=>20.0, "cool"=>10.0}}{"created_at"=>2010-09-21 22:00:00 UTC, "tags"=>{"weird"=>15.0, "cool"=>14.0, "foo"=>13.0, "stupid"=>6.0, "bar"=>11.0, "dumb"=>9.0}}{"created_at"=>2010-09-23 22:00:00 UTC, "tags"=>{"weird"=>15.0, "stupid"=>15.0, "dumb"=>15.0, "foo"=>16.0, "cool"=>10.0, "bar"=>11.0}}{"created_at"=>2010-09-29 22:00:00 UTC, "tags"=>{"bar"=>9.0, "cool"=>14.0, "weird"=>16.0, "foo"=>8.0, "dumb"=>9.0, "stupid"=>12.0}}{"created_at"=>2010-09-27 22:00:00 UTC, "tags"=>{"cool"=>13.0, "dumb"=>10.0, "stupid"=>12.0, "bar"=>8.0, "foo"=>16.0, "weird"=>13.0}}{"created_at"=>2010-09-04 22:00:00 UTC, "tags"=>{"cool"=>11.0, "bar"=>9.0, "stupid"=>6.0, "weird"=>11.0, "dumb"=>8.0, "foo"=>11.0}}{"created_at"=>2010-09-08 22:00:00 UTC, "tags"=>{"stupid"=>12.0, "dumb"=>11.0, "cool"=>15.0, "foo"=>11.0, "bar"=>9.0, "weird"=>8.0}}{"created_at"=>2010-10-02 22:00:00 UTC, "tags"=>{"bar"=>8.0, "dumb"=>8.0, "cool"=>10.0, "foo"=>10.0, "stupid"=>8.0, "weird"=>6.0}}{"created_at"=>2010-09-24 22:00:00 UTC, "tags"=>{"foo"=>13.0, "bar"=>12.0, "stupid"=>15.0, "weird"=>17.0, "dumb"=>7.0, "cool"=>10.0}}{"created_at"=>2010-09-30 22:00:00 UTC, "tags"=>{"bar"=>10.0, "cool"=>6.0, "stupid"=>14.0, "weird"=>9.0, "dumb"=>12.0, "foo"=>19.0}}{"created_at"=>2010-09-05 22:00:00 UTC, "tags"=>{"dumb"=>12.0, "foo"=>19.0, "weird"=>8.0, "stupid"=>8.0, "bar"=>7.0, "cool"=>10.0}}{"created_at"=>2010-09-17 22:00:00 UTC, "tags"=>{"weird"=>13.0, "bar"=>14.0, "dumb"=>12.0, "foo"=>12.0, "stupid"=>10.0, "cool"=>9.0}}{"created_at"=>2010-09-18 22:00:00 UTC, "tags"=>{"dumb"=>8.0, "cool"=>11.0, "foo"=>6.0, "bar"=>12.0, "weird"=>7.0, "stupid"=>6.0}}{"created_at"=>2010-09-09 22:00:00 UTC, "tags"=>{"weird"=>11.0, "dumb"=>9.0, "foo"=>6.0, "bar"=>11.0, "cool"=>11.0, "stupid"=>6.0}}{"created_at"=>2010-09-13 22:00:00 UTC, "tags"=>{"dumb"=>19.0, "stupid"=>9.0, "weird"=>12.0, "cool"=>11.0, "bar"=>10.0, "foo"=>15.0}}{"created_at"=>2010-09-16 22:00:00 UTC, "tags"=>{"bar"=>6.0, "weird"=>8.0, "dumb"=>9.0, "cool"=>11.0, "stupid"=>17.0, "foo"=>15.0}}{"created_at"=>2010-09-11 22:00:00 UTC, "tags"=>{"foo"=>10.0, "weird"=>9.0, "bar"=>8.0, "cool"=>4.0, "dumb"=>8.0, "stupid"=>9.0}}{"created_at"=>2010-09-26 22:00:00 UTC, "tags"=>{"dumb"=>15.0, "weird"=>6.0, "stupid"=>15.0, "bar"=>10.0, "foo"=>13.0, "cool"=>15.0}}{"created_at"=>2010-10-01 22:00:00 UTC, "tags"=>{"cool"=>7.0, "weird"=>11.0, "stupid"=>11.0, "bar"=>14.0, "foo"=>12.0, "dumb"=>11.0}}{"created_at"=>2010-09-12 22:00:00 UTC, "tags"=>{"bar"=>7.0, "weird"=>12.0, "stupid"=>11.0, "cool"=>10.0, "foo"=>11.0, "dumb"=>9.0}}{"created_at"=>2010-09-14 22:00:00 UTC, "tags"=>{"dumb"=>8.0, "foo"=>15.0, "cool"=>15.0, "stupid"=>15.0, "bar"=>7.0, "weird"=>14.0}}{"created_at"=>2010-09-07 22:00:00 UTC, "tags"=>{"dumb"=>10.0, "cool"=>7.0, "foo"=>14.0, "weird"=>15.0, "bar"=>11.0, "stupid"=>7.0}}{"created_at"=>2010-09-06 22:00:00 UTC, "tags"=>{"dumb"=>7.0, "bar"=>11.0, "cool"=>16.0, "weird"=>14.0, "foo"=>12.0, "stupid"=>6.0}}
Donnerstag, 7. Oktober 2010
{"created_at"=>2010-09-19 22:00:00 UTC, "tags"=>{"foo"=>11.0, "dumb"=>12.0, "stupid"=>7.0, "bar"=>7.0, "cool"=>14.0, "weird"=>17.0}}{"created_at"=>2010-09-20 22:00:00 UTC, "tags"=>{"dumb"=>11.0, "stupid"=>5.0, "foo"=>10.0, "cool"=>8.0, "weird"=>9.0, "bar"=>15.0}}{"created_at"=>2010-09-22 22:00:00 UTC, "tags"=>{"weird"=>15.0, "bar"=>9.0, "stupid"=>17.0, "cool"=>11.0, "dumb"=>10.0, "foo"=>12.0}}{"created_at"=>2010-09-15 22:00:00 UTC, "tags"=>{"foo"=>11.0, "weird"=>7.0, "stupid"=>10.0, "cool"=>11.0, "bar"=>5.0, "dumb"=>8.0}}{"created_at"=>2010-09-25 22:00:00 UTC, "tags"=>{"dumb"=>11.0, "weird"=>14.0, "cool"=>8.0, "foo"=>21.0, "bar"=>11.0, "stupid"=>13.0}}{"created_at"=>2010-09-28 22:00:00 UTC, "tags"=>{"cool"=>11.0, "dumb"=>16.0, "stupid"=>11.0, "weird"=>15.0, "foo"=>9.0, "bar"=>16.0}}{"created_at"=>2010-09-10 22:00:00 UTC, "tags"=>{"dumb"=>15.0, "weird"=>9.0, "bar"=>8.0, "cool"=>14.0, "stupid"=>11.0, "foo"=>11.0}}{"created_at"=>2010-09-03 22:00:00 UTC, "tags"=>{"weird"=>14.0, "dumb"=>15.0, "stupid"=>11.0, "foo"=>16.0, "bar"=>20.0, "cool"=>10.0}}{"created_at"=>2010-09-21 22:00:00 UTC, "tags"=>{"weird"=>15.0, "cool"=>14.0, "foo"=>13.0, "stupid"=>6.0, "bar"=>11.0, "dumb"=>9.0}}{"created_at"=>2010-09-23 22:00:00 UTC, "tags"=>{"weird"=>15.0, "stupid"=>15.0, "dumb"=>15.0, "foo"=>16.0, "cool"=>10.0, "bar"=>11.0}}{"created_at"=>2010-09-29 22:00:00 UTC, "tags"=>{"bar"=>9.0, "cool"=>14.0, "weird"=>16.0, "foo"=>8.0, "dumb"=>9.0, "stupid"=>12.0}}{"created_at"=>2010-09-27 22:00:00 UTC, "tags"=>{"cool"=>13.0, "dumb"=>10.0, "stupid"=>12.0, "bar"=>8.0, "foo"=>16.0, "weird"=>13.0}}{"created_at"=>2010-09-04 22:00:00 UTC, "tags"=>{"cool"=>11.0, "bar"=>9.0, "stupid"=>6.0, "weird"=>11.0, "dumb"=>8.0, "foo"=>11.0}}{"created_at"=>2010-09-08 22:00:00 UTC, "tags"=>{"stupid"=>12.0, "dumb"=>11.0, "cool"=>15.0, "foo"=>11.0, "bar"=>9.0, "weird"=>8.0}}{"created_at"=>2010-10-02 22:00:00 UTC, "tags"=>{"bar"=>8.0, "dumb"=>8.0, "cool"=>10.0, "foo"=>10.0, "stupid"=>8.0, "weird"=>6.0}}{"created_at"=>2010-09-24 22:00:00 UTC, "tags"=>{"foo"=>13.0, "bar"=>12.0, "stupid"=>15.0, "weird"=>17.0, "dumb"=>7.0, "cool"=>10.0}}{"created_at"=>2010-09-30 22:00:00 UTC, "tags"=>{"bar"=>10.0, "cool"=>6.0, "stupid"=>14.0, "weird"=>9.0, "dumb"=>12.0, "foo"=>19.0}}{"created_at"=>2010-09-05 22:00:00 UTC, "tags"=>{"dumb"=>12.0, "foo"=>19.0, "weird"=>8.0, "stupid"=>8.0, "bar"=>7.0, "cool"=>10.0}}{"created_at"=>2010-09-17 22:00:00 UTC, "tags"=>{"weird"=>13.0, "bar"=>14.0, "dumb"=>12.0, "foo"=>12.0, "stupid"=>10.0, "cool"=>9.0}}{"created_at"=>2010-09-18 22:00:00 UTC, "tags"=>{"dumb"=>8.0, "cool"=>11.0, "foo"=>6.0, "bar"=>12.0, "weird"=>7.0, "stupid"=>6.0}}{"created_at"=>2010-09-09 22:00:00 UTC, "tags"=>{"weird"=>11.0, "dumb"=>9.0, "foo"=>6.0, "bar"=>11.0, "cool"=>11.0, "stupid"=>6.0}}{"created_at"=>2010-09-13 22:00:00 UTC, "tags"=>{"dumb"=>19.0, "stupid"=>9.0, "weird"=>12.0, "cool"=>11.0, "bar"=>10.0, "foo"=>15.0}}{"created_at"=>2010-09-16 22:00:00 UTC, "tags"=>{"bar"=>6.0, "weird"=>8.0, "dumb"=>9.0, "cool"=>11.0, "stupid"=>17.0, "foo"=>15.0}}{"created_at"=>2010-09-11 22:00:00 UTC, "tags"=>{"foo"=>10.0, "weird"=>9.0, "bar"=>8.0, "cool"=>4.0, "dumb"=>8.0, "stupid"=>9.0}}{"created_at"=>2010-09-26 22:00:00 UTC, "tags"=>{"dumb"=>15.0, "weird"=>6.0, "stupid"=>15.0, "bar"=>10.0, "foo"=>13.0, "cool"=>15.0}}{"created_at"=>2010-10-01 22:00:00 UTC, "tags"=>{"cool"=>7.0, "weird"=>11.0, "stupid"=>11.0, "bar"=>14.0, "foo"=>12.0, "dumb"=>11.0}}{"created_at"=>2010-09-12 22:00:00 UTC, "tags"=>{"bar"=>7.0, "weird"=>12.0, "stupid"=>11.0, "cool"=>10.0, "foo"=>11.0, "dumb"=>9.0}}{"created_at"=>2010-09-14 22:00:00 UTC, "tags"=>{"dumb"=>8.0, "foo"=>15.0, "cool"=>15.0, "stupid"=>15.0, "bar"=>7.0, "weird"=>14.0}}{"created_at"=>2010-09-07 22:00:00 UTC, "tags"=>{"dumb"=>10.0, "cool"=>7.0, "foo"=>14.0, "weird"=>15.0, "bar"=>11.0, "stupid"=>7.0}}{"created_at"=>2010-09-06 22:00:00 UTC, "tags"=>{"dumb"=>7.0, "bar"=>11.0, "cool"=>16.0, "weird"=>14.0, "foo"=>12.0, "stupid"=>6.0}}
"tags" => { "foo" => 11.0, "dumb" => 12.0, "stupid" => 7.0, "bar" => 7.0, "cool" => 14.0, "weird" => 17.0}
Donnerstag, 7. Oktober 2010
function(prev) { var mostPopular = 0; for(i in prev.tags) { if(prev.tags[i] > mostPopular) { prev.tag = i; prev.count = prev.tags[i]; mostPopular = prev.tags[i]; } } delete prev.tags}
Donnerstag, 7. Oktober 2010
{"created_at"=>2010-09-27 22:00:00 UTC, "tag"=>"stupid", "count"=>18.0}{"created_at"=>2010-09-29 22:00:00 UTC, "tag"=>"stupid", "count"=>20.0}{"created_at"=>2010-09-12 22:00:00 UTC, "tag"=>"cool", "count"=>11.0}{"created_at"=>2010-09-04 22:00:00 UTC, "tag"=>"stupid", "count"=>12.0}{"created_at"=>2010-09-21 22:00:00 UTC, "tag"=>"stupid", "count"=>16.0}{"created_at"=>2010-09-03 22:00:00 UTC, "tag"=>"foo", "count"=>15.0}{"created_at"=>2010-09-26 22:00:00 UTC, "tag"=>"foo", "count"=>17.0}{"created_at"=>2010-09-18 22:00:00 UTC, "tag"=>"foo", "count"=>17.0}{"created_at"=>2010-09-24 22:00:00 UTC, "tag"=>"cool", "count"=>11.0}
Donnerstag, 7. Oktober 2010
Map / Reduce
Donnerstag, 7. Oktober 2010
collection = @db['people'].map_reduce( map, reduce)collection.find()
Donnerstag, 7. Oktober 2010
function() { this.tags.forEach(function(z) { emit(z, {count: 1}); });}
Donnerstag, 7. Oktober 2010
function(key, values) { var total = 0; values.forEach(function(v) { total += v.count }); return {count: total}}
Donnerstag, 7. Oktober 2010
Indexes
Donnerstag, 7. Oktober 2010
db['people'].create_index("tags")
@db['people'].create_index( [["tags", Mongo::ASCENDING]])
db['people'].drop_index("tags_1")
db['people'].drop_indexes
db['people'].index_information
Donnerstag, 7. Oktober 2010
Geospatial stuff
Donnerstag, 7. Oktober 2010
@db['people'].create_index( [["latlng", Mongo::GEO2D]])
Donnerstag, 7. Oktober 2010
@db['people'].find( "latlng" => {"$near" => [53.593978, 10.107380]})
Donnerstag, 7. Oktober 2010
GridFS usage
Donnerstag, 7. Oktober 2010
grid = Mongo::Grid.new(@db)
id = grid.put("You can put Strings in here", :filename => 'test.txt')
file = grid.get(id)
file.filenamefile.read
grid.delete(id)
grid.put( File.open("/Users/jankrutisch/Dropbox/Photos/IMGP8989.jpg"))
Donnerstag, 7. Oktober 2010
fs = Mongo::GridFileSystem.new(db)
fs.open("test.txt", "w") do |f| f.write "You can put stuff in here"end
fs.open("test.txt", "r") do |f| puts f.readend
fs.delete("test.txt")
Donnerstag, 7. Oktober 2010
Capped collections
Donnerstag, 7. Oktober 2010
@db.create_collection('capped_numbers', :capped => true, :max => 50)
@db.create_collection('capped_numbers', :capped => true, :size => 1024 * 64)
Donnerstag, 7. Oktober 2010
explain
Donnerstag, 7. Oktober 2010
@db['people'].find( "address.city" => /haven/).explain
Donnerstag, 7. Oktober 2010
@db['people'].find( "address.city" => /haven/).explain
Donnerstag, 7. Oktober 2010
{ "cursor"=>"BasicCursor", "nscanned"=>1000, "nscannedObjects"=>1000, "n"=>39, "millis"=>2, "indexBounds"=>{}, "allPlans"=>[ {"cursor"=>"BasicCursor", "indexBounds"=>{}} ]}
Donnerstag, 7. Oktober 2010
{ "cursor"=>"BtreeCursor address.city_1 multi", "nscanned"=>1000, "nscannedObjects"=>39, "n"=>39, "millis"=>1, "indexBounds"=>{ "address.city"=>[["", {}], [/haven/, /haven/]] }, "allPlans"=>[ { "cursor"=>"BtreeCursor address.city_1 multi", "indexBounds"=>{ "address.city"=>[["", {}], [/haven/, /haven/]] } } ]}
Donnerstag, 7. Oktober 2010
misc commands
Donnerstag, 7. Oktober 2010
@db.stats
{ "collections"=>4, "objects"=>1011, "avgObjSize"=>244.6330365974283, "dataSize"=>247324, "storageSize"=>345600, "numExtents"=>6, "indexes"=>3, "indexSize"=>114688, "fileSize"=>201326592, "ok"=>1.0}
Donnerstag, 7. Oktober 2010
@db.add_stored_function( "tag_size", "function(obj) {return obj.tags.length}")
@db['people'].find( "$where" => 'tag_size(this) === 2')
Donnerstag, 7. Oktober 2010
@db.add_stored_function( "tag_size", "function(obj) {return obj.tags.length}")
@db['people'].find( "$where" => 'tag_size(this) === 2')
Donnerstag, 7. Oktober 2010
Libraries
Donnerstag, 7. Oktober 2010
mongo_mapper
Donnerstag, 7. Oktober 2010
John Nunemaker@jnunemaker
Donnerstag, 7. Oktober 2010
is in production
Donnerstag, 7. Oktober 2010
documentation?
Donnerstag, 7. Oktober 2010
Donnerstag, 7. Oktober 2010
how to
Donnerstag, 7. Oktober 2010
rails initializer
Donnerstag, 7. Oktober 2010
# config/initializers/mongo_mapper.rbmongo_config = YAML.load_file( File.join(Rails.root, 'config','mongomapper.yml'))MongoMapper.setup(mongo_config, Rails.env)
Donnerstag, 7. Oktober 2010
a simple example
Donnerstag, 7. Oktober 2010
MongoMapper.connection = @connectionMongoMapper.database = "test"
class Quote include MongoMapper::Document key :from key :text key :views, Integer timestamps!end
Donnerstag, 7. Oktober 2010
finders
Donnerstag, 7. Oktober 2010
Quote.where(:from => 'Yogi Berra').all
Quote.where(:from => 'Yogi Berra').limit(5).sort(:from.desc).all
Donnerstag, 7. Oktober 2010
embedded docs
Donnerstag, 7. Oktober 2010
class Person include MongoMapper::Document key :name one :address key :tags, Arrayend
class Address include MongoMapper::Document key :street key :city key :country key :zipend
Donnerstag, 7. Oktober 2010
person = Person.firstaddress = Person.first.address
Donnerstag, 7. Oktober 2010
scopes
Donnerstag, 7. Oktober 2010
class Person scope :tagged, lambda { |tag| where(:tags.in => [tag]) }end
puts Person.tagged('cool').first.inspect
Donnerstag, 7. Oktober 2010
new website coming soon
Donnerstag, 7. Oktober 2010
new website coming soonUnfortunately I‘ve already said that
@ FrOSCON in August
Donnerstag, 7. Oktober 2010
new website coming soonUnfortunately I‘ve already said that
@ FrOSCON in August
Donnerstag, 7. Oktober 2010
mongoid
Donnerstag, 7. Oktober 2010
Durran Jordan(of Hashrocket)
Donnerstag, 7. Oktober 2010
Two major versions
Donnerstag, 7. Oktober 2010
1.x (1.9.x) targeting Rails 2.3.x
Donnerstag, 7. Oktober 2010
2.x (2.0beta) targeting Rails 3.0
Donnerstag, 7. Oktober 2010
Good documentation
Donnerstag, 7. Oktober 2010
Donnerstag, 7. Oktober 2010
rails initializer
Donnerstag, 7. Oktober 2010
File.open(File.join(RAILS_ROOT, 'config/mongodb.yml'), 'r') do |f| @settings = YAML.load(f)[RAILS_ENV]end
Mongoid::Config.instance.from_hash(@settings)
Donnerstag, 7. Oktober 2010
a simple example
Donnerstag, 7. Oktober 2010
class Quote include Mongoid::Document include Mongoid::Timestamps field :from field :text field :views, :type => Integerend
Donnerstag, 7. Oktober 2010
finders
Donnerstag, 7. Oktober 2010
Quote.where(:from => 'Yogi Berra').all
Quote.where(:from => 'Yogi Berra').limit(5).order_by(:from.desc).all
Donnerstag, 7. Oktober 2010
embedded docs
Donnerstag, 7. Oktober 2010
class Person include Mongoid::Document field :name embeds_one :address field :tags, :type => Arrayend
class Address include Mongoid::Document field :street field :city field :country field :zipend
Donnerstag, 7. Oktober 2010
person = Person.firstaddress = Person.first.address
Donnerstag, 7. Oktober 2010
scopes
Donnerstag, 7. Oktober 2010
class Person scope :tagged, lambda { |tag| where(:tags.in => [tag]) }end
puts Person.tagged('cool').first.inspect
Donnerstag, 7. Oktober 2010
More features
Donnerstag, 7. Oktober 2010
atomic updates
Donnerstag, 7. Oktober 2010
mongoid tries to be clever
Donnerstag, 7. Oktober 2010
(using the „dirty“ flags)
Donnerstag, 7. Oktober 2010
(it‘s probably better to bypass the ODM sometimes)
Donnerstag, 7. Oktober 2010
GridFS
Donnerstag, 7. Oktober 2010
external libraries for both
Donnerstag, 7. Oktober 2010
mongo_mapper > grip
Donnerstag, 7. Oktober 2010
mongoid > mongoid_grid
Donnerstag, 7. Oktober 2010
validations
Donnerstag, 7. Oktober 2010
both through ActiveModel or validatable (Rails <3)
Donnerstag, 7. Oktober 2010
Other noteworthy libraries
Donnerstag, 7. Oktober 2010
The „ORM“ variant
Donnerstag, 7. Oktober 2010
mongodoc
http://github.com/leshill/mongodoc
Donnerstag, 7. Oktober 2010
mongo-record
http://github.com/mongodb/mongo-record
Donnerstag, 7. Oktober 2010
mongomodel
http://github.com/spohlenz/mongomodel
Donnerstag, 7. Oktober 2010
mongomatic
http://github.com/benmyles/mongomatic
Donnerstag, 7. Oktober 2010
Queues
Donnerstag, 7. Oktober 2010
mongo_queue
http://github.com/Skiz/mongo_queue
Donnerstag, 7. Oktober 2010
mongo_queue
http://github.com/Skiz/mongo_queue
Last commit on github.com in March...
Donnerstag, 7. Oktober 2010
resque-mongo
http://github.com/ctrochalakis/resque-mongo
Donnerstag, 7. Oktober 2010
resque-mongo
http://github.com/ctrochalakis/resque-mongo
Last commit on github.com in January...
Donnerstag, 7. Oktober 2010
Misc
Donnerstag, 7. Oktober 2010
em-mongo
http://github.com/bcg/em-mongo
Donnerstag, 7. Oktober 2010
dm-mongo-adapter
http://github.com/solnic/dm-mongo-adapter
Donnerstag, 7. Oktober 2010
questions? injuries?
Donnerstag, 7. Oktober 2010
I ♥
Donnerstag, 7. Oktober 2010
thanks for listening.
‣ [email protected]‣ http://jan.krutisch.de/‣ http://github.com/halfbyte/‣ http://twitter.com/halfbyte‣ http://www.mindmatters.de/
‣ http://www.mongodb.org/‣ http://www.mongoid.org/‣ http://github.com/jnunemaker/mongo_mapper‣ http://github.com/halfbyte/mongo_ruby_examples
Donnerstag, 7. Oktober 2010