SlideShare una empresa de Scribd logo
1 de 184
Descargar para leer sin conexión
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. 174n22767 HamburgnDE",
"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
Primary
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 test
switched 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 test
switched 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.inspect
end
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});
});
}
END
reduce = <<-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.filename
file.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.read
end
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.rb
File.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 = @connection
MongoMapper.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, Array
end
class Address
include MongoMapper::Document
key :street
key :city
key :country
key :zip
end
Samstag, 23. Oktober 2010
person = Person.first
address = 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 => Integer
end
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 => Array
end
class Address
include Mongoid::Document
field :street
field :city
field :country
field :zip
end
Samstag, 23. Oktober 2010
person = Person.first
address = 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

Más contenido relacionado

La actualidad más candente

MongoDB for Perl Developers
MongoDB for Perl DevelopersMongoDB for Perl Developers
MongoDB for Perl Developers
Ynon Perek
 
Optimizing Slow Queries with Indexes and Creativity
Optimizing Slow Queries with Indexes and CreativityOptimizing Slow Queries with Indexes and Creativity
Optimizing Slow Queries with Indexes and Creativity
MongoDB
 
MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤
Takahiro Inoue
 
MongoDB全機能解説2
MongoDB全機能解説2MongoDB全機能解説2
MongoDB全機能解説2
Takahiro Inoue
 
MongoDB Indexing Constraints and Creative Schemas
MongoDB Indexing Constraints and Creative SchemasMongoDB Indexing Constraints and Creative Schemas
MongoDB Indexing Constraints and Creative Schemas
MongoDB
 

La actualidad más candente (20)

Ruby on CouchDB - SimplyStored and RockingChair
Ruby on CouchDB - SimplyStored and RockingChairRuby on CouchDB - SimplyStored and RockingChair
Ruby on CouchDB - SimplyStored and RockingChair
 
MongoDB for Perl Developers
MongoDB for Perl DevelopersMongoDB for Perl Developers
MongoDB for Perl Developers
 
The Ring programming language version 1.5.1 book - Part 44 of 180
The Ring programming language version 1.5.1 book - Part 44 of 180The Ring programming language version 1.5.1 book - Part 44 of 180
The Ring programming language version 1.5.1 book - Part 44 of 180
 
Basic crud operation
Basic crud operationBasic crud operation
Basic crud operation
 
Mythbusting: Understanding How We Measure the Performance of MongoDB
Mythbusting: Understanding How We Measure the Performance of MongoDBMythbusting: Understanding How We Measure the Performance of MongoDB
Mythbusting: Understanding How We Measure the Performance of MongoDB
 
MySQL flexible schema and JSON for Internet of Things
MySQL flexible schema and JSON for Internet of ThingsMySQL flexible schema and JSON for Internet of Things
MySQL flexible schema and JSON for Internet of Things
 
Optimizing Slow Queries with Indexes and Creativity
Optimizing Slow Queries with Indexes and CreativityOptimizing Slow Queries with Indexes and Creativity
Optimizing Slow Queries with Indexes and Creativity
 
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...
 
MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤
 
Mongo db for C# Developers
Mongo db for C# DevelopersMongo db for C# Developers
Mongo db for C# Developers
 
20110514 mongo dbチューニング
20110514 mongo dbチューニング20110514 mongo dbチューニング
20110514 mongo dbチューニング
 
(gentle (introduction Clojure))
(gentle (introduction Clojure))(gentle (introduction Clojure))
(gentle (introduction Clojure))
 
Inside MongoDB: the Internals of an Open-Source Database
Inside MongoDB: the Internals of an Open-Source DatabaseInside MongoDB: the Internals of an Open-Source Database
Inside MongoDB: the Internals of an Open-Source Database
 
Building DSLs with Groovy
Building DSLs with GroovyBuilding DSLs with Groovy
Building DSLs with Groovy
 
MongoDB全機能解説2
MongoDB全機能解説2MongoDB全機能解説2
MongoDB全機能解説2
 
Back to basics Italian webinar 2 Mia prima applicazione MongoDB
Back to basics Italian webinar 2  Mia prima applicazione MongoDBBack to basics Italian webinar 2  Mia prima applicazione MongoDB
Back to basics Italian webinar 2 Mia prima applicazione MongoDB
 
MongoDB Indexing Constraints and Creative Schemas
MongoDB Indexing Constraints and Creative SchemasMongoDB Indexing Constraints and Creative Schemas
MongoDB Indexing Constraints and Creative Schemas
 
MongoDB
MongoDBMongoDB
MongoDB
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance Tuning
 
Better Web Clients with Mantle and AFNetworking
Better Web Clients with Mantle and AFNetworkingBetter Web Clients with Mantle and AFNetworking
Better Web Clients with Mantle and AFNetworking
 

Similar a Mongodb railscamphh

The Tech Side of Project Argo
The Tech Side of Project ArgoThe Tech Side of Project Argo
The Tech Side of Project Argo
Wesley Lindamood
 
Multi dimensional profiling
Multi dimensional profilingMulti dimensional profiling
Multi dimensional profiling
bergel
 
Document-Oriented Databases: Couchdb Primer
Document-Oriented Databases: Couchdb PrimerDocument-Oriented Databases: Couchdb Primer
Document-Oriented Databases: Couchdb Primer
jsiarto
 

Similar a Mongodb railscamphh (16)

MongoDB on Rails (and Ruby)
MongoDB on Rails (and Ruby)MongoDB on Rails (and Ruby)
MongoDB on Rails (and Ruby)
 
Mongo db
Mongo dbMongo db
Mongo db
 
Ajax solr
Ajax solrAjax solr
Ajax solr
 
The Tech Side of Project Argo
The Tech Side of Project ArgoThe Tech Side of Project Argo
The Tech Side of Project Argo
 
Designing With Type :: FontConf 2010
Designing With Type :: FontConf 2010Designing With Type :: FontConf 2010
Designing With Type :: FontConf 2010
 
Metaprogramming
MetaprogrammingMetaprogramming
Metaprogramming
 
D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4
 
jQuery Way
jQuery WayjQuery Way
jQuery Way
 
Multi dimensional profiling
Multi dimensional profilingMulti dimensional profiling
Multi dimensional profiling
 
Developing in HTML5: Widgetbox & Sencha Touch
Developing in HTML5: Widgetbox & Sencha TouchDeveloping in HTML5: Widgetbox & Sencha Touch
Developing in HTML5: Widgetbox & Sencha Touch
 
Cassandra devoxx 2010
Cassandra devoxx 2010Cassandra devoxx 2010
Cassandra devoxx 2010
 
Chaco Step-by-Step
Chaco Step-by-StepChaco Step-by-Step
Chaco Step-by-Step
 
Desenvolvendo Aplicativos Sociais com Rails 3
Desenvolvendo Aplicativos Sociais com Rails 3Desenvolvendo Aplicativos Sociais com Rails 3
Desenvolvendo Aplicativos Sociais com Rails 3
 
Tree tricks osdc_melbourne_20101124
Tree tricks osdc_melbourne_20101124Tree tricks osdc_melbourne_20101124
Tree tricks osdc_melbourne_20101124
 
Python avanzado - parte 1
Python avanzado - parte 1Python avanzado - parte 1
Python avanzado - parte 1
 
Document-Oriented Databases: Couchdb Primer
Document-Oriented Databases: Couchdb PrimerDocument-Oriented Databases: Couchdb Primer
Document-Oriented Databases: Couchdb Primer
 

Más de jan_mindmatters

Railsrumble railscamphh 2010
Railsrumble railscamphh 2010Railsrumble railscamphh 2010
Railsrumble railscamphh 2010
jan_mindmatters
 
10 fun projects to improve your coding skills
10 fun projects to improve your coding skills10 fun projects to improve your coding skills
10 fun projects to improve your coding skills
jan_mindmatters
 

Más de jan_mindmatters (12)

Ruby for Artists and Tinkerers. A non-presentation.
Ruby for Artists and Tinkerers. A non-presentation.Ruby for Artists and Tinkerers. A non-presentation.
Ruby for Artists and Tinkerers. A non-presentation.
 
realtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsrealtime audio on ze web @ hhjs
realtime audio on ze web @ hhjs
 
Railsrumble railscamphh 2010
Railsrumble railscamphh 2010Railsrumble railscamphh 2010
Railsrumble railscamphh 2010
 
10 fun projects to improve your coding skills
10 fun projects to improve your coding skills10 fun projects to improve your coding skills
10 fun projects to improve your coding skills
 
Open Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerersOpen Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerers
 
Liebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & less
Liebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & lessLiebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & less
Liebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & less
 
Facebook mit Rails und Facebooker
Facebook mit Rails und FacebookerFacebook mit Rails und Facebooker
Facebook mit Rails und Facebooker
 
Show the frontend some love - HAML, SASS and COMPASS
Show the frontend some love - HAML, SASS and COMPASSShow the frontend some love - HAML, SASS and COMPASS
Show the frontend some love - HAML, SASS and COMPASS
 
HAML / SASS and COMPASS
HAML / SASS and COMPASSHAML / SASS and COMPASS
HAML / SASS and COMPASS
 
Merb. Rails in anders.
Merb. Rails in anders.Merb. Rails in anders.
Merb. Rails in anders.
 
Lehmanns Rails Erweitern
Lehmanns Rails ErweiternLehmanns Rails Erweitern
Lehmanns Rails Erweitern
 
Rails i18n - Railskonferenz 2007
Rails i18n - Railskonferenz 2007Rails i18n - Railskonferenz 2007
Rails i18n - Railskonferenz 2007
 

Último

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 

Mongodb railscamphh