Más contenido relacionado La actualidad más candente (20) Similar a MongoDB: um banco de dados orientado a documento (20) Más de Julio Monteiro (13) MongoDB: um banco de dados orientado a documento4. AGENDA
1. Objetivo
2. Histórico
3. Características
4. Relacional versus MongoDB
5. Consultas
6. Map/reduce
7. Operações atômicas
8. Índices
9. Geoposicionamento
10.Por onde continuar?
5. OBJETIVO
MongoDB busca aproveitar vantagens
de armazenamentos de chave-valor
(que, no geral, são rápidos e escaláveis)
e banco de dados relacionais tradicionais
(que, no geral, oferecem consultas ricas e várias funcionalidades).
(Adaptado do site oficial do MongoDB)
7. HISTÓRICO
• Produto da 10gen
• Desenvolvimento iniciou em Outubro de 2007
• Primeira versão pública em Fevereiro de 2009
• Atualmente na versão 1.6
• Licenciado sob a GNU AGPL
11. TABELA
id nome sobrenome idade
1 Ana Silva 20
2 Maria Carvalho 22
3 João Chaves 21
4 Mário Schimitd 30
... ... ... ...
12. DOCUMENTO
Id: 1 Id: 2
Nome: Ana Nome: Maria
Sobrenome: Silva Sobrenome: Carvalho
Idade: 20 Idade: 22
Id: 3 Id: 4
Nome: João Nome: Mário
Sobrenome: Chaves Sobrenome: Schimitd
Idade: 21 Idade: 30
13. TERMINOLOGIA
Relacional Tradicional MongoDB
(MySQL, PostgreSQL, etc)
Database Database
(Banco de dados) (Banco de dados)
Table Collection
(Tabela) (Coleção)
Row Document
(Linha, registro) (Documento)
Column Attribute
(Coluna) (Atributo)
16. DOCUMENTO EM
{ MONGODB
"_id" : ObjectID("4c03e856e258c2701930c091"),
"titulo" : "Campus Party Brasil 2011 vêm aí",
"atalho" : "campus-party-brasil-2011-vem-ai",
"texto" : "A Campus Party Brasil 2011 está chegando, e com elas diversas
atrações!",
"publicado" : true,
"criado_em" : "Mon Oct 4 2010 16:00:00 GMT-0300 (BRT)",
"atualizado_em" : "Mon Oct 4 2010 16:00:00 GMT-0300 (BRT)",
"comentarios" : [
{
"autor" : "Julio",
"email" : "julio@monteiro.eti.br",
"conteudo" : "Gostei muito da Campus!",
"criado_em" : "Mon Oct 4 2010 17:00:00 GMT-0300 (BRT)"
}
],
"palavras_chave" : [ "cpbr4", "campus", "party" ]
}
22. COMO BUSCO...
• ... por uma palavra inteira?
db.artigos.find({"titulo" : "campus"})
• ... por parte de uma palavra?
db.artigos.find({"titulo" : /campus/i})
• ... por uma palavra dentro de um array?
db.artigos.find({"palavras_chave" : "campus"})
• ... por uma palavra dentro de um embutido?
db.artigos.find({ "comentarios.email" :
"julio@monteiro.eti.br" })
23. COMO ATUALIZO...
... determinado atributo de um registro?
db.artigos.update(
{ "comentarios.email" : "julio@monteiro.eti.br" },
{ $set:
{
"comentarios.$.email" : "julio@awegen.com"
}
}
)
25. OPERADORES
$gt
$all
$gte
$size
$lt
$exists
$lte
$type
$ne
$elemMatch
$in
$not
$nin
$where
$mod
26. USANDO OPERADORES
• Maior que ($gt):
terceiraIdade = db.pessoas.find({ "age": { $gt:
75 } })
• Incluindo ($in):
interessante = db.artigos.find({ "tags" : { $in :
["mongodb", "interessante"] } })
• Não incluindo ($nin):
todo = db.tarefas.find({ "status" : { $nin : [ "em
execucao", "terminado" ] } })
27. FUNÇÕES ARBITRÁRIAS
• Usando funções arbitrárias (com $where):
db.artigos.find({ $where : function() {
return this.acessos % 2 == 0
} })
• Usando agrupamento (com $group):
db.artigos.group({
"key" : { "hits" : true },
"initial" : { "count": 0 },
"reduce" : function(obj, prev) {
prev.count++;
}
})
28. FUNÇÃO DE AGRUPAMENTO
• Dado que possui documentos como...
{
domain: "www.mongodb.org",
invoked_at: {d:"2009-11-03", t:"17:14:05"},
response_time: 0.05,
http_action: "GET /display/DOCS/Aggregation"
}
29. FUNÇÃO DE AGRUPAMENTO
• Agrupamento:
db.test.group(
{ cond: {"invoked_at.d": {$gte: "2009-11", $lt:
"2009-12"}}
, key: {http_action: true}
, initial: {count: 0, total_time:0}
, reduce: function(doc, out){ out.count++;
out.total_time+=doc.response_time }
, finalize: function(out){ out.avg_time =
out.total_time / out.count }
} )
30. FUNÇÃO DE AGRUPAMENTO
• Retorno do agrupamento:
[
{
"http_action" : "GET /display/DOCS/
Aggregation",
"count" : 1,
"total_time" : 0.05,
"avg_time" : 0.05
}
]
34. 1 1 2
1 1 1
1 1 2
1 1 1
1 1
1 1
36. BANCO DE DADOS
db.items.insert({tags: ['dog', 'cat']})
db.items.insert({tags: ['dog']})
db.items.insert({tags: ['dog', 'mouse']})
db.items.insert({tags: ['dog', 'mouse', 'hippo']})
db.items.insert({tags: ['dog', 'mouse', 'hippo']})
db.items.insert({tags: ['dog', 'hippo']})
37. MAP
var map = function() {
this.tags.forEach(function(t) {
emit(t, {count: 1})
})
}
38. REDUCE
var reduce = function(key, val) {
var count = 0;
for(var i = 0, len = val.length; i < len; i++) {
count += val[i].count
}
return { count: count };
}
40. RESULTADO
{
"result" : "tmp.mr.mapreduce_1286209644_2",
"timeMillis" : 30,
"counts" : {
"input" : 6,
"emit" : 13,
"output" : 4
},
"ok" : 1,
}
42. MAP/REDUCE
{ "_id" : "cat", "value" : { "count" : 1 } }
{ "_id" : "dog", "value" : { "count" : 6 } }
{ "_id" : "hippo", "value" : { "count" : 3 } }
{ "_id" : "mouse", "value" : { "count" : 3 } }
44. OPERAÇÕES ATÔMICAS
• Incrementando com $inc
db.artigos.update(
{ _id : new ObjectId("4c041...")},
{ $inc: {"hits": 1} }
)
• Atualizando:
db.posts.update({}, { $set : { "hits" : 0 }})
46. ÍNDICES
• Desempenho lento para escrita, mas muito mais rápida para
leitura
• Para melhores resultados, crie índices por onde você busca
• MongoDB mantém índices em memória
52. LUGARES MAIS PERTO
db.lugares.find({
localizacao: { $near : [
21.123456789, -20.123456789
]}
})
53. 20 LUGARES MAIS PERTO
db.lugares.find({
localizacao: { $near : [
21.123456789, -20.123456789
]}
}).limit(20)
61. OBRIGADO!
Júlio Monteiro
julio@monteiro.eti.br