latinoware
TRANSCRIPT
![Page 1: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/1.jpg)
base de dados orientada a
documentos para aplicações Web
Kristina Chodorow
![Page 2: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/2.jpg)
Who am I?
Software Engineer at
Here from New York City
![Page 3: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/3.jpg)
Why Use
Non-Relational DBs?
![Page 4: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/4.jpg)
![Page 5: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/5.jpg)
![Page 6: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/6.jpg)
CAP
• Consistency
• Availability
• Partitioning
nome : "joe" nome : "joe"
![Page 7: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/7.jpg)
Key-Value Stores
Key Value
foo bar
x 123
ts 6:13:26 12/3/1945
data \x9F\x44\x1e
Tokyo Cabinet, Dynamo, MemcacheDB
![Page 8: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/8.jpg)
Key-Value Stores
•Fast
•Simple•Too simple
![Page 9: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/9.jpg)
Column-Oriented
Cassandra
![Page 10: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/10.jpg)
Document-Oriented
{
date : Date(2007-05-07),
time : {
start : 9.25,
end : 10.25
}
sum : 0,
comments : ["task 1", "run 4", "testing module"]
}
vs.
![Page 11: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/11.jpg)
Consistency
Availability
Partitioning
![Page 12: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/12.jpg)
master
slave
Consistency
Availability
Partitioning
![Page 13: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/13.jpg)
slave
Consistency
Availability
Partitioning
![Page 14: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/14.jpg)
master
Consistency
Availability
Partitioning
![Page 15: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/15.jpg)
master
slave
Consistency
Availability
Partitioning
![Page 16: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/16.jpg)
Router
Pair
Pair
Pair
Consistency
Availability
Partitioning
...eventual consistency
![Page 17: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/17.jpg)
![Page 18: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/18.jpg)
![Page 19: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/19.jpg)
Introduction to MongoDB
![Page 20: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/20.jpg)
A JavaScript Database
$ mongodb-linux-1.0/bin/mongo
MongoDB shell version: 1.0.0
url: test
connecting to: test
type "help" for help
>
![Page 21: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/21.jpg)
JSON and BSONStrict JSON types:
{
x : null, y : true, z : 123, w : "xyz",
a : { b : 1 }, c : [1, 2, 3]
}
Mongo JSON adds:
{
ts : new Date(),
query : /regex/ig,
_id : new ObjectId()
}
![Page 22: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/22.jpg)
Collections, not Tables
![Page 23: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/23.jpg)
Collections
{
date : Date(2007-05-07),
time : {
start : 9.25,
end : 10.25
}
sum : 0,
comments : ["task 1", "run 4"]
}
![Page 24: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/24.jpg)
Using the Shell
> db
test
> use xyz
> db
xyz
> db.splorch.find()
>
![Page 25: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/25.jpg)
Inserting
> db.foo.insert({name : "Joe", age : 34})
> db.foo.find({name : "Joe"})
{
"_id" :
ObjectId("2fe3e4d892aa73234c910bed"),
"name" : "Joe",
"age" : 34
}
![Page 26: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/26.jpg)
Object Idsan autogenerated primary key
"_id" : ObjectId("2fe3e4d892aa73234c910bed")
12 bytes:
2fe3e4d892aa73234c910bed
|------||----||--||----|
ts mac pid inc
![Page 27: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/27.jpg)
Nested Objects
> db.blog.insert({title : "First Post",
content : "Hello, world!",
author : {name : "Joe", id : 123},
comments : []
})
![Page 28: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/28.jpg)
Querying
posts = db.blog.find({
"author" : "Joe"})
commentsByFred = db.blog.find({
"comments.author" : "Fred"})
commentedByFred = db.blog.find({
"comments.author" : /fred/i})
![Page 29: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/29.jpg)
Speaking of indexing…
db.people.ensureIndex({"age" : 1});
db.people.ensureIndex({
"name" : -1,
"ts" : -1,
"comments.author" : 1
});
![Page 30: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/30.jpg)
Updating
db.blog.update({title : "First Post"}, {
$push : {
comments : {
author : "Fred",
comment : "Dumb post."
}
}
});
![Page 31: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/31.jpg)
…which gives us:
> db.blog.findOne()
{
_id : ObjectId("4ae06192213900000000745c"),
"title" : "First Post",
"content" : "Hello, world!"
"author" : {"name" : "Joe", "id" : 123}
"comments" : [{
"author" : "Fred",
"comment" : "Dumb post"
}]
}
![Page 32: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/32.jpg)
$ instead of >, <, =, etc.
$gt, $gte, $lt, $lte, $eq, $neq, $exists,
$set, $mod, $where, $in, $nin, $inc
$push, $pull, $pop, $pushAll, $popAll
db.foo.bar.find({x : {$gt : 4}})
![Page 33: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/33.jpg)
$where
db.blog.findOne({$where :
'this.y == (this.x + this.z)'});
Will work:
{"x" : 1, "y" : 4, "z" : 3}
{"x" : "hi", "y" : "hibye", "z" : "bye"}
Won’t work:
{"x" : 1, "y" : 1}
![Page 34: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/34.jpg)
Optimizing $where
db.blogs.findOne({
name : "Sally",
age : {'$gt' : 18},
$where : 'Array.sort(this.interests)[2]
== "volleyball"'});
![Page 35: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/35.jpg)
Cursors
cursor = db.blah.find(array("foo" : "bar"))
while (cursor.hasNext()) {
obj = cursor.next()
}
![Page 36: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/36.jpg)
Applications
![Page 37: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/37.jpg)
Dextify2
FetLife
soliMAP
@trackmeet
![Page 38: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/38.jpg)
Paging
cursor = db.results.find()
.sort({"ts" : -1})
.skip(page_num * results_per_page)
.limit(results_per_page);
![Page 39: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/39.jpg)
Logging
• insert/update/remove is fast
• Capped collections
• Schemaless
• $inc for counts
![Page 40: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/40.jpg)
Storing Files
Max: 4Mb
![Page 41: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/41.jpg)
Storing Files
(More than 4 Mb)
![Page 42: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/42.jpg)
Storing Files
chunks
JJ J
J
JJ
J
J
J
J_id :files
![Page 43: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/43.jpg)
Storing Files
ObjectId fileId = new ObjectId();
fileObj = {
_id : fileId,
filename : "ggbridge.png",
user : "joe",
takenIn : "San Francisco"
}
chunkObj = {
fileId : fileId,
chunkNum : N
data : <binary data>
}
![Page 44: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/44.jpg)
Aggregation
group =~ GROUP BY
Map/Reducedb.runCommand({
mapreduce : <collection>,
map : <mapfunction>,
reduce : <reducefunction>
[, query : <query filter object>]
[, out : <outputcollectionname>]
[, keeptemp: <true|false>]
[, finalize : <finalizefunction>]
})
![Page 45: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/45.jpg)
www.mongodb.org
![Page 46: Latinoware](https://reader036.vdocuments.mx/reader036/viewer/2022081403/55625300d8b42a1b4b8b4f08/html5/thumbnails/46.jpg)
Drivers
C#, Erlang, Factor