mongodb: um banco de dados orientado a documento

61
Júlio Monteiro [email protected]

Upload: julio-monteiro

Post on 19-May-2015

3.920 views

Category:

Technology


0 download

DESCRIPTION

Palestra ministrada no dia 18 de janeiro de 2011 (2011-01-18) na Campus Party Brasil 2010, na área de Desenvolvimento, em São Paulo/SP.

TRANSCRIPT

Page 2: MongoDB: um banco de dados orientado a documento

/ME

Rails Developer, JobScore (http://www.jobscore.com)

Page 3: MongoDB: um banco de dados orientado a documento

/ME

http://julio.monteiro.eti.br

Page 4: MongoDB: um banco de dados orientado a documento

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?

Page 5: MongoDB: um banco de dados orientado a documento

OBJETIVO

MongoDB busca aproveitar vantagensde 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)

Page 6: MongoDB: um banco de dados orientado a documento

Quando Chuck Norris fala, todos ficam em silêncio. E morrem.

Page 7: MongoDB: um banco de dados orientado a documento

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

Page 8: MongoDB: um banco de dados orientado a documento

CARACTERÍSTICAS (1/2)

• Armazenamento orientado a documentos

• Índices

• Consultas ricas (rich queries)

• Atualizações in-place rápidas

•Map/Reduce

Page 9: MongoDB: um banco de dados orientado a documento

CARACTERÍSTICAS (2/2)

• Replicação e Alta Disponibilidade

• Auto-Sharding

• GridFS

• Suporte Comercial (da 10gen)

Page 10: MongoDB: um banco de dados orientado a documento

RELACIONAL VERSUS MONGODB

Page 11: MongoDB: um banco de dados orientado a documento

TABELA

id nome sobrenome idade

1 Ana Silva 20

2 Maria Carvalho 22

3 João Chaves 21

4 Mário Schimitd 30

... ... ... ...

Page 12: MongoDB: um banco de dados orientado a documento

DOCUMENTO

Id: 1Nome: AnaSobrenome: SilvaIdade: 20

Id: 2Nome: MariaSobrenome: CarvalhoIdade: 22

Id: 3Nome: JoãoSobrenome: ChavesIdade: 21

Id: 4Nome: MárioSobrenome: SchimitdIdade: 30

Page 13: MongoDB: um banco de dados orientado a documento

TERMINOLOGIARelacional Tradicional

(MySQL, PostgreSQL, etc)MongoDB

Database(Banco de dados)

Database(Banco de dados)

Table(Tabela)

Collection(Coleção)

Row(Linha, registro)

Document(Documento)

Column(Coluna)

Attribute(Atributo)

Page 14: MongoDB: um banco de dados orientado a documento

MODELO ENTIDADE-RELACIONAMENTO

MYSQL

artigos comentarios

palavras_chave

artigos_palavras_chave

Page 15: MongoDB: um banco de dados orientado a documento

MODELO ENTIDADEMONGODB

artigos

comentarios

palavras_chave

Page 16: MongoDB: um banco de dados orientado a documento

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" : "[email protected]", "conteudo" : "Gostei muito da Campus!", "criado_em" : "Mon Oct 4 2010 17:00:00 GMT-0300 (BRT)" } ], "palavras_chave" : [ "cpbr4", "campus", "party" ]}

Page 17: MongoDB: um banco de dados orientado a documento

JSONJavaScript Object Notation

Page 18: MongoDB: um banco de dados orientado a documento

JSONJavaScript Object NotationBinary

B

Page 19: MongoDB: um banco de dados orientado a documento
Page 20: MongoDB: um banco de dados orientado a documento
Page 21: MongoDB: um banco de dados orientado a documento

CONSULTAS

Page 22: MongoDB: um banco de dados orientado a documento

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" : "[email protected]" })

Page 23: MongoDB: um banco de dados orientado a documento

COMO ATUALIZO...

... determinado atributo de um registro?db.artigos.update( { "comentarios.email" : "[email protected]" }, { $set: { "comentarios.$.email" : "[email protected]" } })

Page 24: MongoDB: um banco de dados orientado a documento

$SET ?

Page 25: MongoDB: um banco de dados orientado a documento

$gt$gte$lt$lte$ne$in$nin$mod

$all$size$exists$type$elemMatch$not$where

OPERADORES

Page 26: MongoDB: um banco de dados orientado a documento

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" ] } })

Page 27: MongoDB: um banco de dados orientado a documento

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++; }})

Page 28: MongoDB: um banco de dados orientado a documento

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"}

Page 29: MongoDB: um banco de dados orientado a documento

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 }} )

Page 30: MongoDB: um banco de dados orientado a documento

FUNÇÃO DE AGRUPAMENTO

• Retorno do agrupamento:[ { "http_action" : "GET /display/DOCS/Aggregation", "count" : 1, "total_time" : 0.05, "avg_time" : 0.05 }]

Page 31: MongoDB: um banco de dados orientado a documento

MAP/REDUCE

Page 32: MongoDB: um banco de dados orientado a documento
Page 33: MongoDB: um banco de dados orientado a documento
Page 34: MongoDB: um banco de dados orientado a documento

2

2

1

1

1

1

1

1

1

1

1

1

1

1

1

1

Page 35: MongoDB: um banco de dados orientado a documento

4

3

7

4

Page 36: MongoDB: um banco de dados orientado a documento

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']})

Page 37: MongoDB: um banco de dados orientado a documento

MAP

var map = function() {

this.tags.forEach(function(t) {

emit(t, {count: 1})

})

}

Page 38: MongoDB: um banco de dados orientado a documento

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 };

}

Page 39: MongoDB: um banco de dados orientado a documento

EXECUTANDO

var result = db.items.mapReduce(map, reduce);

Page 40: MongoDB: um banco de dados orientado a documento

RESULTADO

{

"result" : "tmp.mr.mapreduce_1286209644_2", "timeMillis" : 30,

"counts" : {

"input" : 6,

"emit" : 13,

"output" : 4 },

"ok" : 1,

}

Page 41: MongoDB: um banco de dados orientado a documento

RESULTADO (MESMO!)

db["tmp.mr.mapreduce_1286209644_2"].find()

db[result['result']].find()

Page 42: MongoDB: um banco de dados orientado a documento

MAP/REDUCE

{ "_id" : "cat", "value" : { "count" : 1 } }

{ "_id" : "dog", "value" : { "count" : 6 } }

{ "_id" : "hippo", "value" : { "count" : 3 } }

{ "_id" : "mouse", "value" : { "count" : 3 } }

Page 43: MongoDB: um banco de dados orientado a documento

OPERAÇÕES ATÔMICAS

Page 44: MongoDB: um banco de dados orientado a documento

OPERAÇÕES ATÔMICAS

• Incrementando com $incdb.artigos.update( { _id : new ObjectId("4c041...")}, { $inc: {"hits": 1} })

• Atualizando:db.posts.update({}, { $set : { "hits" : 0 }})

Page 45: MongoDB: um banco de dados orientado a documento

ÍNDICES

Page 46: MongoDB: um banco de dados orientado a documento

Í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

Page 47: MongoDB: um banco de dados orientado a documento

SEM ÍNDICE

db.items.find({tags: "dog"}).explain();

{

"cursor" : "BasicCursor",

"nscanned" : 6,

"nscannedObjects" : 6,

"n" : 6,

"millis" : 10,

"indexBounds" : {

}

}

Page 48: MongoDB: um banco de dados orientado a documento

APLICANDO O ÍNDICE

db.items.ensureIndex({tags: 1})

Page 49: MongoDB: um banco de dados orientado a documento

COM ÍNDICEdb.items.find({tags: "dog"}).explain();{

"cursor" : "BtreeCursor tags_1", "nscanned" : 6, "nscannedObjects" : 6,

"n" : 6, "millis" : 0,

"indexBounds" : { "tags" : [ [

"dog", "dog"

] ] }

}

Page 50: MongoDB: um banco de dados orientado a documento

GEOPOSICIONAMENTO

Page 51: MongoDB: um banco de dados orientado a documento

GEOPOSICIONAMENTO

• Geoposicionamento, com MongoDB, é estupidamente simples

• Apenas adicione um índice:db.lugares.ensureIndex({ localizacao: "2d" })

Page 52: MongoDB: um banco de dados orientado a documento

LUGARES MAIS PERTO

db.lugares.find({

localizacao: { $near : [

21.123456789, -20.123456789

]}

})

Page 53: MongoDB: um banco de dados orientado a documento

20 LUGARES MAIS PERTO

db.lugares.find({

localizacao: { $near : [

21.123456789, -20.123456789

]}

}).limit(20)

Page 54: MongoDB: um banco de dados orientado a documento

EM UMA ÁREA

Page 55: MongoDB: um banco de dados orientado a documento

EM UMA ÁREA

db.lugares.find({

localizacao: { $within: { $box: {

[

[21.123456789, -20.123456789],

[22.123456789, -21.123456789]

]

}}}

})

Page 56: MongoDB: um banco de dados orientado a documento

POR ONDE CONTINUAR?

Page 59: MongoDB: um banco de dados orientado a documento

REFERÊNCIAS

Page 60: MongoDB: um banco de dados orientado a documento

REFERÊNCIAS