Mongodb railscamphh

Post on 30-Oct-2014

1.315 views 3 download

Tags:

description

 

Transcript of Mongodb railscamphh

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