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. 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
1 of 184

Recommended

MongoDB & Mongomapper 4 real by
MongoDB & Mongomapper 4 realMongoDB & Mongomapper 4 real
MongoDB & Mongomapper 4 realjan_mindmatters
11.9K views104 slides
Mongodb on Ruby And Rails (froscon 2010) by
Mongodb on Ruby And Rails (froscon 2010)Mongodb on Ruby And Rails (froscon 2010)
Mongodb on Ruby And Rails (froscon 2010)jan_mindmatters
1.5K views183 slides
MongoDB - Introduction by
MongoDB - IntroductionMongoDB - Introduction
MongoDB - IntroductionVagmi Mudumbai
1K views36 slides
Rapid and Scalable Development with MongoDB, PyMongo, and Ming by
Rapid and Scalable Development with MongoDB, PyMongo, and MingRapid and Scalable Development with MongoDB, PyMongo, and Ming
Rapid and Scalable Development with MongoDB, PyMongo, and MingRick Copeland
1.6K views28 slides
はじめてのMongoDB by
はじめてのMongoDBはじめてのMongoDB
はじめてのMongoDBTakahiro Inoue
16.1K views72 slides
Webinarserie: Einführung in MongoDB: “Back to Basics” - Teil 3 - Interaktion ... by
Webinarserie: Einführung in MongoDB: “Back to Basics” - Teil 3 - Interaktion ...Webinarserie: Einführung in MongoDB: “Back to Basics” - Teil 3 - Interaktion ...
Webinarserie: Einführung in MongoDB: “Back to Basics” - Teil 3 - Interaktion ...MongoDB
1.7K views34 slides

More Related Content

What's hot

Ruby on CouchDB - SimplyStored and RockingChair by
Ruby on CouchDB - SimplyStored and RockingChairRuby on CouchDB - SimplyStored and RockingChair
Ruby on CouchDB - SimplyStored and RockingChairJonathan Weiss
882 views21 slides
MongoDB for Perl Developers by
MongoDB for Perl DevelopersMongoDB for Perl Developers
MongoDB for Perl DevelopersYnon Perek
5.6K views44 slides
The Ring programming language version 1.5.1 book - Part 44 of 180 by
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 180Mahmoud Samir Fayed
20 views10 slides
Basic crud operation by
Basic crud operationBasic crud operation
Basic crud operationzarigatongy
226 views20 slides
Mythbusting: Understanding How We Measure the Performance of MongoDB by
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 MongoDBMongoDB
2K views76 slides
MySQL flexible schema and JSON for Internet of Things by
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 ThingsAlexander Rubin
468 views35 slides

What's hot(20)

Ruby on CouchDB - SimplyStored and RockingChair by Jonathan Weiss
Ruby on CouchDB - SimplyStored and RockingChairRuby on CouchDB - SimplyStored and RockingChair
Ruby on CouchDB - SimplyStored and RockingChair
Jonathan Weiss882 views
MongoDB for Perl Developers by Ynon Perek
MongoDB for Perl DevelopersMongoDB for Perl Developers
MongoDB for Perl Developers
Ynon Perek5.6K views
The Ring programming language version 1.5.1 book - Part 44 of 180 by Mahmoud Samir Fayed
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 by zarigatongy
Basic crud operationBasic crud operation
Basic crud operation
zarigatongy226 views
Mythbusting: Understanding How We Measure the Performance of MongoDB by 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
MongoDB2K views
MySQL flexible schema and JSON for Internet of Things by Alexander Rubin
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
Alexander Rubin468 views
Optimizing Slow Queries with Indexes and Creativity by MongoDB
Optimizing Slow Queries with Indexes and CreativityOptimizing Slow Queries with Indexes and Creativity
Optimizing Slow Queries with Indexes and Creativity
MongoDB4.2K views
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's... by MongoDB
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...
MongoDB1.1K views
MongoDBで作るソーシャルデータ新解析基盤 by Takahiro Inoue
MongoDBで作るソーシャルデータ新解析基盤MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤
Takahiro Inoue29K views
20110514 mongo dbチューニング by Yuichi Matsuo
20110514 mongo dbチューニング20110514 mongo dbチューニング
20110514 mongo dbチューニング
Yuichi Matsuo27K views
(gentle (introduction Clojure)) by Guy Taylor
(gentle (introduction Clojure))(gentle (introduction Clojure))
(gentle (introduction Clojure))
Guy Taylor943 views
Inside MongoDB: the Internals of an Open-Source Database by Mike Dirolf
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
Mike Dirolf52.5K views
Building DSLs with Groovy by Sten Anderson
Building DSLs with GroovyBuilding DSLs with Groovy
Building DSLs with Groovy
Sten Anderson542 views
Back to basics Italian webinar 2 Mia prima applicazione MongoDB by 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
MongoDB995 views
MongoDB Indexing Constraints and Creative Schemas by MongoDB
MongoDB Indexing Constraints and Creative SchemasMongoDB Indexing Constraints and Creative Schemas
MongoDB Indexing Constraints and Creative Schemas
MongoDB2.4K views
MongoDB Performance Tuning by Puneet Behl
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance Tuning
Puneet Behl1.8K views
Better Web Clients with Mantle and AFNetworking by Guillermo Gonzalez
Better Web Clients with Mantle and AFNetworkingBetter Web Clients with Mantle and AFNetworking
Better Web Clients with Mantle and AFNetworking
Guillermo Gonzalez6.6K views

Similar to Mongodb railscamphh

MongoDB on Rails (and Ruby) by
MongoDB on Rails (and Ruby)MongoDB on Rails (and Ruby)
MongoDB on Rails (and Ruby)jan_mindmatters
914 views213 slides
Mongo db by
Mongo dbMongo db
Mongo dbAntonio Terreno
710 views31 slides
Ajax solr by
Ajax solrAjax solr
Ajax solrJeff Wallace
2K views38 slides
The Tech Side of Project Argo by
The Tech Side of Project ArgoThe Tech Side of Project Argo
The Tech Side of Project ArgoWesley Lindamood
1.4K views44 slides
Opening up the Social Web - Standards that are bridging the Islands by
Opening up the Social Web - Standards that are bridging the Islands Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands Bastian Hofmann
1.7K views55 slides
Designing With Type :: FontConf 2010 by
Designing With Type :: FontConf 2010Designing With Type :: FontConf 2010
Designing With Type :: FontConf 2010Kyle Meyer
957 views68 slides

Similar to Mongodb railscamphh(17)

Opening up the Social Web - Standards that are bridging the Islands by Bastian Hofmann
Opening up the Social Web - Standards that are bridging the Islands Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands
Bastian Hofmann1.7K views
Designing With Type :: FontConf 2010 by Kyle Meyer
Designing With Type :: FontConf 2010Designing With Type :: FontConf 2010
Designing With Type :: FontConf 2010
Kyle Meyer957 views
D-Talk: What's awesome about Ruby 2.x and Rails 4 by Jan Berdajs
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
Jan Berdajs1.5K views
Multi dimensional profiling by bergel
Multi dimensional profilingMulti dimensional profiling
Multi dimensional profiling
bergel320 views
Developing in HTML5: Widgetbox & Sencha Touch by Sencha
Developing in HTML5: Widgetbox & Sencha TouchDeveloping in HTML5: Widgetbox & Sencha Touch
Developing in HTML5: Widgetbox & Sencha Touch
Sencha1.7K views
Cassandra devoxx 2010 by jbellis
Cassandra devoxx 2010Cassandra devoxx 2010
Cassandra devoxx 2010
jbellis1.3K views
Desenvolvendo Aplicativos Sociais com Rails 3 by Carlos Brando
Desenvolvendo Aplicativos Sociais com Rails 3Desenvolvendo Aplicativos Sociais com Rails 3
Desenvolvendo Aplicativos Sociais com Rails 3
Carlos Brando665 views
Tree tricks osdc_melbourne_20101124 by David Fetter
Tree tricks osdc_melbourne_20101124Tree tricks osdc_melbourne_20101124
Tree tricks osdc_melbourne_20101124
David Fetter417 views
Python avanzado - parte 1 by coto
Python avanzado - parte 1Python avanzado - parte 1
Python avanzado - parte 1
coto888 views
Document-Oriented Databases: Couchdb Primer by jsiarto
Document-Oriented Databases: Couchdb PrimerDocument-Oriented Databases: Couchdb Primer
Document-Oriented Databases: Couchdb Primer
jsiarto1.5K views

More from jan_mindmatters

Ruby for Artists and Tinkerers. A non-presentation. by
Ruby for Artists and Tinkerers. A non-presentation.Ruby for Artists and Tinkerers. A non-presentation.
Ruby for Artists and Tinkerers. A non-presentation.jan_mindmatters
1K views23 slides
realtime audio on ze web @ hhjs by
realtime audio on ze web @ hhjsrealtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsjan_mindmatters
1.2K views32 slides
Railsrumble railscamphh 2010 by
Railsrumble railscamphh 2010Railsrumble railscamphh 2010
Railsrumble railscamphh 2010jan_mindmatters
733 views42 slides
10 fun projects to improve your coding skills by
10 fun projects to improve your coding skills10 fun projects to improve your coding skills
10 fun projects to improve your coding skillsjan_mindmatters
22.3K views41 slides
Open Source Hardware - Of makers and tinkerers by
Open Source Hardware - Of makers and tinkerersOpen Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerersjan_mindmatters
1.6K views56 slides
Liebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & less by
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 & lessjan_mindmatters
1.1K views184 slides

More from jan_mindmatters(12)

Ruby for Artists and Tinkerers. A non-presentation. by jan_mindmatters
Ruby for Artists and Tinkerers. A non-presentation.Ruby for Artists and Tinkerers. A non-presentation.
Ruby for Artists and Tinkerers. A non-presentation.
jan_mindmatters1K views
realtime audio on ze web @ hhjs by jan_mindmatters
realtime audio on ze web @ hhjsrealtime audio on ze web @ hhjs
realtime audio on ze web @ hhjs
jan_mindmatters1.2K views
10 fun projects to improve your coding skills by jan_mindmatters
10 fun projects to improve your coding skills10 fun projects to improve your coding skills
10 fun projects to improve your coding skills
jan_mindmatters22.3K views
Open Source Hardware - Of makers and tinkerers by jan_mindmatters
Open Source Hardware - Of makers and tinkerersOpen Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerers
jan_mindmatters1.6K views
Liebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & less by jan_mindmatters
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
jan_mindmatters1.1K views
Facebook mit Rails und Facebooker by jan_mindmatters
Facebook mit Rails und FacebookerFacebook mit Rails und Facebooker
Facebook mit Rails und Facebooker
jan_mindmatters799 views
Show the frontend some love - HAML, SASS and COMPASS by jan_mindmatters
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
jan_mindmatters1.2K views
Rails i18n - Railskonferenz 2007 by jan_mindmatters
Rails i18n - Railskonferenz 2007Rails i18n - Railskonferenz 2007
Rails i18n - Railskonferenz 2007
jan_mindmatters1.2K views

Recently uploaded

virtual reality.pptx by
virtual reality.pptxvirtual reality.pptx
virtual reality.pptxG036GaikwadSnehal
14 views15 slides
Melek BEN MAHMOUD.pdf by
Melek BEN MAHMOUD.pdfMelek BEN MAHMOUD.pdf
Melek BEN MAHMOUD.pdfMelekBenMahmoud
14 views1 slide
Zero to Automated in Under a Year by
Zero to Automated in Under a YearZero to Automated in Under a Year
Zero to Automated in Under a YearNetwork Automation Forum
15 views23 slides
Evolving the Network Automation Journey from Python to Platforms by
Evolving the Network Automation Journey from Python to PlatformsEvolving the Network Automation Journey from Python to Platforms
Evolving the Network Automation Journey from Python to PlatformsNetwork Automation Forum
13 views21 slides
Uni Systems for Power Platform.pptx by
Uni Systems for Power Platform.pptxUni Systems for Power Platform.pptx
Uni Systems for Power Platform.pptxUni Systems S.M.S.A.
56 views21 slides
STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdf by
STKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdfSTKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdf
STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdfDr. Jimmy Schwarzkopf
20 views29 slides

Recently uploaded(20)

STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdf by Dr. Jimmy Schwarzkopf
STKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdfSTKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdf
STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdf
PharoJS - Zürich Smalltalk Group Meetup November 2023 by Noury Bouraqadi
PharoJS - Zürich Smalltalk Group Meetup November 2023PharoJS - Zürich Smalltalk Group Meetup November 2023
PharoJS - Zürich Smalltalk Group Meetup November 2023
Noury Bouraqadi132 views
6g - REPORT.pdf by Liveplex
6g - REPORT.pdf6g - REPORT.pdf
6g - REPORT.pdf
Liveplex10 views
STPI OctaNE CoE Brochure.pdf by madhurjyapb
STPI OctaNE CoE Brochure.pdfSTPI OctaNE CoE Brochure.pdf
STPI OctaNE CoE Brochure.pdf
madhurjyapb14 views
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f... by TrustArc
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc11 views
"Running students' code in isolation. The hard way", Yurii Holiuk by Fwdays
"Running students' code in isolation. The hard way", Yurii Holiuk "Running students' code in isolation. The hard way", Yurii Holiuk
"Running students' code in isolation. The hard way", Yurii Holiuk
Fwdays17 views
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N... by James Anderson
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...
James Anderson92 views
TouchLog: Finger Micro Gesture Recognition Using Photo-Reflective Sensors by sugiuralab
TouchLog: Finger Micro Gesture Recognition  Using Photo-Reflective SensorsTouchLog: Finger Micro Gesture Recognition  Using Photo-Reflective Sensors
TouchLog: Finger Micro Gesture Recognition Using Photo-Reflective Sensors
sugiuralab21 views
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive by Network Automation Forum
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLiveAutomating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Case Study Copenhagen Energy and Business Central.pdf by Aitana
Case Study Copenhagen Energy and Business Central.pdfCase Study Copenhagen Energy and Business Central.pdf
Case Study Copenhagen Energy and Business Central.pdf
Aitana16 views

Mongodb railscamphh