Post on 30-Oct-2014
description
on rails
railscamp hamburg, 2010
jan krutisch <jan@krutisch.de>http://jan.krutisch.de/
Samstag, 23. Oktober 2010
mongodb wtf? lol!?
Samstag, 23. Oktober 2010
document database
Samstag, 23. Oktober 2010
document database
NoSQLincluded!
Samstag, 23. Oktober 2010
10gen
Samstag, 23. Oktober 2010
open source
http://github.com/mongodb/mongo
Samstag, 23. Oktober 2010
id title descr pos_lat pos_lng
Samstag, 23. Oktober 2010
{ "_id" : ObjectId("4c00245062610475a005afcd"), "address" : "Bernstorffstr. 174\n22767 Hamburg\nDE", "description" : null, "position" : { "lat" : 53.5600912, "lng" : 9.9596977 }, "tags" : [ "hausarzt", "naturheilverfahren", "akupunktur", "allgemeinmedizin" ], "title" : "Dr. med. Lilo Eisenbarth", "loxicon_id" : 808261 }
Samstag, 23. Oktober 2010
Samstag, 23. Oktober 2010
✗Samstag, 23. Oktober 2010
Samstag, 23. Oktober 2010
BSON
Samstag, 23. Oktober 2010
BInary Serialized jsON
http://bsonspec.org/Samstag, 23. Oktober 2010
Wire
Samstag, 23. Oktober 2010
Storage
Samstag, 23. Oktober 2010
rich queries
Samstag, 23. Oktober 2010
conceptually close to SQL
Samstag, 23. Oktober 2010
easy to grasp
Samstag, 23. Oktober 2010
flexible
Samstag, 23. Oktober 2010
language integration
Samstag, 23. Oktober 2010
on top: map/reduce
Samstag, 23. Oktober 2010
Scaling
Samstag, 23. Oktober 2010
Master/Slave replication
Samstag, 23. Oktober 2010
Replica Sets (1.6)
Samstag, 23. Oktober 2010
Primary
Member Member
Samstag, 23. Oktober 2010
Prim
ary
Member Primary
Samstag, 23. Oktober 2010
Member
Member Primary
Samstag, 23. Oktober 2010
Autosharding (1.6)
Samstag, 23. Oktober 2010
Samstag, 23. Oktober 2010
Durability
Samstag, 23. Oktober 2010
No single server durability!
Samstag, 23. Oktober 2010
fsyncs every 60s(configurable)
Samstag, 23. Oktober 2010
Use Replication!
Samstag, 23. Oktober 2010
Use write propagation locking
Samstag, 23. Oktober 2010
Single Server Durability planned for 1.8
Samstag, 23. Oktober 2010
mongo console
Samstag, 23. Oktober 2010
$ mongo
Samstag, 23. Oktober 2010
> use testswitched to db test
db.quotes.save({ text: "You can observe a lot just by watching.", from: "Yogi Berra", created_at: new Date() });
db.quotes.save({ text: "Silence is one of the hardest arguments to refute.", from: "Josh Billings", created_at: new Date() });
Samstag, 23. Oktober 2010
> use testswitched to db test
db.quotes.save({ text: "You can observe a lot just by watching.", from: "Yogi Berra", created_at: new Date() });
db.quotes.save({ text: "Silence is one of the hardest arguments to refute.", from: "Josh Billings", created_at: new Date() });
Samstag, 23. Oktober 2010
Indexing
Samstag, 23. Oktober 2010
Same concept as with SQL databases
Samstag, 23. Oktober 2010
You want them
Samstag, 23. Oktober 2010
Same concept as with SQL databases
Samstag, 23. Oktober 2010
Sort order
Samstag, 23. Oktober 2010
Unique
Samstag, 23. Oktober 2010
Compound
Samstag, 23. Oktober 2010
Geospatial
Samstag, 23. Oktober 2010
map/reduce
Samstag, 23. Oktober 2010
we can haz it, too
Samstag, 23. Oktober 2010
function() { this.tags.forEach(function(z) { emit(z, {count: 1}); });}
Samstag, 23. Oktober 2010
function(key, values) { var total = 0; values.forEach(function(v) { total += v.count }); return {count: total}}
Samstag, 23. Oktober 2010
(it‘s not fast...)
Samstag, 23. Oktober 2010
security
Samstag, 23. Oktober 2010
simple user/password auth
Samstag, 23. Oktober 2010
per database
Samstag, 23. Oktober 2010
read only is possible
Samstag, 23. Oktober 2010
one more thing
Samstag, 23. Oktober 2010
GridFS
Samstag, 23. Oktober 2010
Binary fields in BSON < 4MB
Samstag, 23. Oktober 2010
GridFS saves files in chunks
Samstag, 23. Oktober 2010
I‘m in u‘r rubies,querying teh MongoDB!
Samstag, 23. Oktober 2010
core driver
Samstag, 23. Oktober 2010
mongo / bson_ext
Samstag, 23. Oktober 2010
ODMs / Libs
Samstag, 23. Oktober 2010
mongo_mapper
Samstag, 23. Oktober 2010
mongoid
Samstag, 23. Oktober 2010
Find examples here:http://github.com/halfbyte/mongo_ruby_examples
Samstag, 23. Oktober 2010
Basic driver usage
Samstag, 23. Oktober 2010
init
Samstag, 23. Oktober 2010
require 'mongo'
@connection = Mongo::Connection.new@db = @connection.db("test")
Samstag, 23. Oktober 2010
@connection = Mongo::Connection.new( 'localhost', 27017, :pool_size => 5, :timeout => 20)
Samstag, 23. Oktober 2010
@connection = Mongo::Connection.from_uri( "mongodb://localhost:27017/test")
Samstag, 23. Oktober 2010
insert/upsert
Samstag, 23. Oktober 2010
doc = { :text => "You can observe a lot just by watching.", :from => "Yogi Berra", :created_at => Time.now}@db['quotes'].insert(doc)
Samstag, 23. Oktober 2010
doc = @db['quotes'].find_one(id)
doc[:from] = "Yogi Berra, famous baseball player"
@db['quotes'].save(doc)
Samstag, 23. Oktober 2010
atomic updates
Samstag, 23. Oktober 2010
@db['quotes'].update( {"from" => "Yogi Berra"}, {"$inc" => {"reads" => 1 } })
Samstag, 23. Oktober 2010
@db['quotes'].update( {"from" => "Yogi Berra"}, {"$inc" => {"reads" => 1 } })
Samstag, 23. Oktober 2010
$inc$set$unset$push$pushAll
$addToSet$pop$pull$pullAll$
Samstag, 23. Oktober 2010
getting a whole collection
Samstag, 23. Oktober 2010
@db['quotes'].find.each do |row| puts row.inspectend
Samstag, 23. Oktober 2010
exact query
Samstag, 23. Oktober 2010
@db['quotes'].find(:from => "Yogi Berra")
Samstag, 23. Oktober 2010
more queries
Samstag, 23. Oktober 2010
100.times do |i| db['numbers'].insert({"i" => i})end
Samstag, 23. Oktober 2010
db['numbers'].find("i" => {"$lt" => 2})
Samstag, 23. Oktober 2010
$lt <$gt >$lte <=$gte >=$ne !=
Samstag, 23. Oktober 2010
@db['people'].find(:tags => {"$in" => ['cool']})
Samstag, 23. 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"]}
Samstag, 23. 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"]}
Samstag, 23. Oktober 2010
$in IN (2,3,4)$nin NOT IN$all [2,3] ~ [1,2,3]
Samstag, 23. Oktober 2010
$mod yah, RLY$size okay$exists NOT NULL$type huh?
Samstag, 23. Oktober 2010
@db['people'].find("address.city" => /haven/)
Samstag, 23. Oktober 2010
@db['people'].find("address.city" => /haven/)
Samstag, 23. Oktober 2010
Sorting
Samstag, 23. Oktober 2010
@db['people'].find().sort("address.street")
Samstag, 23. Oktober 2010
@db['people'].find().sort("address.street")
Samstag, 23. Oktober 2010
Pagination
Samstag, 23. Oktober 2010
@db['numbers'].find.sort("i").limit(10)
Samstag, 23. Oktober 2010
@db['numbers'].find.sort("i").limit(10).skip(50)
Samstag, 23. Oktober 2010
Counting
Samstag, 23. Oktober 2010
@db['numbers'].find.count
Samstag, 23. Oktober 2010
Distinct
Samstag, 23. Oktober 2010
@db['people'].distinct('tags').inspect
Samstag, 23. Oktober 2010
Group
Samstag, 23. Oktober 2010
Poor mans map/reduce
Samstag, 23. Oktober 2010
@db['people'].group( ['created_at'], {}, {:tags => {}}, reduce, finalize)
Samstag, 23. Oktober 2010
@db['people'].group( ['created_at'], {}, {:tags => {}}, reduce, finalize)
Samstag, 23. Oktober 2010
@db['people'].group( ['created_at'], {}, {:tags => {}}, reduce, finalize)
Samstag, 23. Oktober 2010
@db['people'].group( ['created_at'], {}, {:tags => {}}, reduce, finalize)
Samstag, 23. Oktober 2010
@db['people'].group( ['created_at'], {}, {:tags => {}}, reduce, finalize)
Samstag, 23. 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 } }}
Samstag, 23. 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}}
Samstag, 23. 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}
Samstag, 23. 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}
Samstag, 23. 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}
Samstag, 23. Oktober 2010
Map / Reduce
Samstag, 23. Oktober 2010
map = <<-END function() { this.tags.forEach(function(z) { emit(z, {count: 1}); }); }ENDreduce = <<-END function(key, values) { var total = 0; values.forEach(function(v) { total += v.count }); return {count: total} }END
collection = @db['people'].map_reduce( map, reduce)
Samstag, 23. Oktober 2010
Indexes
Samstag, 23. 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
Samstag, 23. Oktober 2010
Geospatial stuff
Samstag, 23. Oktober 2010
@db['people'].create_index( [["latlng", Mongo::GEO2D]])
Samstag, 23. Oktober 2010
@db['people'].find( "latlng" => {"$near" => [53.593978, 10.107380]})
Samstag, 23. Oktober 2010
GridFS usage
Samstag, 23. 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"))
Samstag, 23. 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")
Samstag, 23. Oktober 2010
Capped collections
Samstag, 23. Oktober 2010
@db.create_collection('capped_numbers', :capped => true, :max => 50)
@db.create_collection('capped_numbers', :capped => true, :size => 1024 * 64)
Samstag, 23. Oktober 2010
explain
Samstag, 23. Oktober 2010
@db['people'].find( "address.city" => /haven/).explain
Samstag, 23. Oktober 2010
@db['people'].find( "address.city" => /haven/).explain
Samstag, 23. Oktober 2010
{ "cursor"=>"BasicCursor", "nscanned"=>1000, "nscannedObjects"=>1000, "n"=>39, "millis"=>2, "indexBounds"=>{}, "allPlans"=>[ {"cursor"=>"BasicCursor", "indexBounds"=>{}} ]}
Samstag, 23. 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/]] } } ]}
Samstag, 23. Oktober 2010
ODMs
Samstag, 23. Oktober 2010
mongo_mapper
Samstag, 23. Oktober 2010
John Nunemaker@jnunemaker
Samstag, 23. Oktober 2010
is in production
Samstag, 23. Oktober 2010
documentation?
Samstag, 23. Oktober 2010
Samstag, 23. Oktober 2010
how to
Samstag, 23. Oktober 2010
rails initializer
Samstag, 23. Oktober 2010
# config/initializers/mongo_mapper.rbFile.open(File.join(Rails.root, 'config/mongodb.yml'), 'r') do |f| @settings = YAML.load(f)[Rails.env]end
MongoMapper.connection = Mongo::Connection.from_uri(@settings["connection"]) if @settings["connection"]
MongoMapper.database = @settings["database"]
Samstag, 23. Oktober 2010
a simple example
Samstag, 23. Oktober 2010
MongoMapper.connection = @connectionMongoMapper.database = "test"
class Quote include MongoMapper::Document key :from key :text key :views, Integer timestamps!end
Samstag, 23. Oktober 2010
finders
Samstag, 23. Oktober 2010
Quote.where(:from => 'Yogi Berra').all
Quote.where(:from => 'Yogi Berra').limit(5).sort(:from.desc).all
Samstag, 23. Oktober 2010
embedded docs
Samstag, 23. Oktober 2010
Samstag, 23. 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
Samstag, 23. Oktober 2010
person = Person.firstaddress = Person.first.address
Samstag, 23. Oktober 2010
scopes
Samstag, 23. Oktober 2010
class Person scope :tagged, lambda { |tag| where(:tags.in => [tag]) }end
puts Person.tagged('cool').first.inspect
Samstag, 23. Oktober 2010
new website coming soon
Samstag, 23. Oktober 2010
mongoid
Samstag, 23. Oktober 2010
Durran Jordan(of Hashrocket)
Samstag, 23. Oktober 2010
Two major versions
Samstag, 23. Oktober 2010
1.x (1.9.x) targeting Rails 2.3.x
Samstag, 23. Oktober 2010
2.x (2.0beta) targeting Rails 3.0
Samstag, 23. Oktober 2010
Good documentation
Samstag, 23. Oktober 2010
Samstag, 23. Oktober 2010
rails initializer
Samstag, 23. 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)
Samstag, 23. Oktober 2010
a simple example
Samstag, 23. Oktober 2010
class Quote include Mongoid::Document include Mongoid::Timestamps field :from field :text field :views, :type => Integerend
Samstag, 23. Oktober 2010
finders
Samstag, 23. Oktober 2010
Quote.where(:from => 'Yogi Berra').all
Quote.where(:from => 'Yogi Berra').limit(5).order_by(:from.desc).all
Samstag, 23. Oktober 2010
embedded docs
Samstag, 23. 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
Samstag, 23. Oktober 2010
person = Person.firstaddress = Person.first.address
Samstag, 23. Oktober 2010
scopes
Samstag, 23. Oktober 2010
class Person scope :tagged, lambda { |tag| where(:tags.in => [tag]) }end
puts Person.tagged('cool').first.inspect
Samstag, 23. Oktober 2010
More features
Samstag, 23. Oktober 2010
atomic updates
Samstag, 23. Oktober 2010
mongoid tries to be clever
Samstag, 23. Oktober 2010
(using the „dirty“ flags)
Samstag, 23. Oktober 2010
(it‘s probably better to bypass the ODM sometimes)
Samstag, 23. Oktober 2010
GridFS
Samstag, 23. Oktober 2010
external libraries for both
Samstag, 23. Oktober 2010
mongo_mapper > grip
Samstag, 23. Oktober 2010
mongoid > mongoid_grid
Samstag, 23. Oktober 2010
Other noteworthy libraries
Samstag, 23. Oktober 2010
Other not so noteworthy libraries
Samstag, 23. Oktober 2010
I ♥
Samstag, 23. Oktober 2010
thanks for listening.
‣ jan@krutisch.de‣ 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
Samstag, 23. Oktober 2010