88
http://cinlug-br.org/

Mongodb workshop cinlug

Embed Size (px)

Citation preview

Page 1: Mongodb workshop cinlug

http://cinlug-br.org/

Page 2: Mongodb workshop cinlug
Page 3: Mongodb workshop cinlug

De acordo com o mongoDB.org:

“Banco de dados escalável, de alta-performance, open-source, schema-free,

orientado-a-documentos.”

Page 4: Mongodb workshop cinlug

documentos

Page 5: Mongodb workshop cinlug

{nome: 'mongo', tipo: 'BD'}

Page 6: Mongodb workshop cinlug

JSON ?

Page 7: Mongodb workshop cinlug

JSON !

hash

dicionário

array

Page 8: Mongodb workshop cinlug

schema-free ?

Page 9: Mongodb workshop cinlug

tipagem dinâmicamigrations de graçaainda posso usar índices

Page 10: Mongodb workshop cinlug

migrations ?

Page 11: Mongodb workshop cinlug

{nome: 'mongo', tipo: 'BD'}

apenas faça:

{nome: 'mongo', tipo: 'BD', versao: 1.6}

Page 12: Mongodb workshop cinlug

coisas que podem fazer falta

Page 13: Mongodb workshop cinlug

As propriedades ACID ficam na mão do programador

Page 14: Mongodb workshop cinlug

Relembrando ACIDSão 4 propriedades que os BDs tradicionais fornecem às aplicações:

AtomicityGarante que um conjunto de modificações seja realizado por completo ou nada é feito

ConsistencyGarante que o banco não está em um estado inconsistente

Isolation Dados que estão durante operação são inacessíveis

DurabilityGarantia de qua transação só é finalizada quando está salva no disco

Page 15: Mongodb workshop cinlug

usando o mongoDB

a partir do Terminal

Page 16: Mongodb workshop cinlug

instalando:

> http://www.mongodb.org/downloads

> escolha a versão adequada ao seu SO e arquitetura (32-bits / 64-bits) (32

> descompacte (dezipe, desenrare) > só isso mesmo...

Page 17: Mongodb workshop cinlug

WARNINGAs versões de 32-bits do mongoDB são limitadas a uns 2.5 GB de dados

Page 18: Mongodb workshop cinlug

Oxe, porque?Como o foco dele é em performance, ele usa um sistema de mapeamento de arquivos em memória em alguns momentos, logo...

Page 19: Mongodb workshop cinlug

usando:

> bin/mongod <- servidor

> bin/mongo <- cliente

Page 20: Mongodb workshop cinlug

usando:

o cliente (vulgo shell) é baseado em Javascript

então podemos fazer qualquer coisa (que faríamos com Javascript num terminal, claro)

Page 21: Mongodb workshop cinlug

usando:> n1 = 5;

> n2 = 8; > if (n2 > n1) { menor = n1; } else { menor = n2; }

Page 22: Mongodb workshop cinlug

usando:criando um documento

> estudante = {nome: 'brunno', nota: 6};

Page 23: Mongodb workshop cinlug

usando:

salvando na coleção

> db.estudantes.insert(estudante);

Page 24: Mongodb workshop cinlug

o insert() acabou de guardar o documento estudante na coleção de estudantes,

localizada na base teste

a coleção estudantes não precisou ser previamente criada, a partir do momento que é

usada o mongoDB cria uma coleção

a base teste é usada por padrão quando conectamos ao mongoDB, podemos escolher outras bases e coleções quando quisermos

Page 25: Mongodb workshop cinlug

usando:escolhendo base e coleção

> show dbs;

> use nomedabase; > show collections; > db.nomedacolecao.metodo();

Page 26: Mongodb workshop cinlug

usando:podemos usar atalhos

> est = db.estudantes;

> est.insert({nome: 'daker', nota: 10});

Page 27: Mongodb workshop cinlug

o campo _id:

todo documento inserido no banco deve conter um campo _id com valor único em toda

coleção, caso ele não exista é automaticamente adicionado (nesse caso usando o tipo binário ObjectId, que servirá

como índice padrão).

Page 28: Mongodb workshop cinlug

usando:

resgatando documentos

> db.estudantes.find();

Page 29: Mongodb workshop cinlug

o find() faz uma consulta e retorna todos os documentos que correspondem ao filtro

passado ao find()

nesse caso o método find() não recebeu nenhum parâmetro, então ele retornou todos

os documentos daquela coleção

Page 30: Mongodb workshop cinlug

usando:resgatando documentos

> est.find({nota: 7}); > est.find({nota: { '$gt': 7});

Page 31: Mongodb workshop cinlug

o $gt é um dos operadores especiais, nesse caso significa '>' (maior que/greater than)

existem vários outros:

$lt - '<', $lte - '<=', $gte - '>=', $ne - '!=' $in - 'no array', $nin - '! no array'

Page 32: Mongodb workshop cinlug

usando:

o findOne()

> est.findOne({nota: 7});

Page 33: Mongodb workshop cinlug

o findOne() retorna o primeiro documento encontrado que corresponda aos parâmetros

da consulta

quando você estiver utilizando o driver da sua linguagem ele já retorna um objeto do tipo

dicionário/hash/coisaDaSuaLinguagem

Page 34: Mongodb workshop cinlug

usando:atualizando um documento

> est.update({ name: 'brunno'}, { name: 'brunno, nota: 10 });

Page 35: Mongodb workshop cinlug

o update() recebe como primeiro parâmetro os filtros da consulta e como segundo a

atualização a ser feita. nesse caso foi passado um outro documento, então ele vai

sobrescrever tudo

existem outras maneiras de se atualizar documentos

Page 36: Mongodb workshop cinlug

usando:atualizando um documento

> est.update({ name: 'brunno' }, { $set: { nota: 8 } });

Page 37: Mongodb workshop cinlug

o $set define o valor 8 no campo nota

caso 'nota' não exista, é criado com valor 8

Page 38: Mongodb workshop cinlug

usando:atualizando um documento

> est.update({ name: 'brunno' }, { $push: { cadeira: 'p1' } });

Page 39: Mongodb workshop cinlug

o $push adiciona o valor 'p1' ao campo 'cadeiras', se 'cadeiras' é um array/lista.

caso 'cadeiras' não exista, é criado com a lista ['p1'] como valor

Page 40: Mongodb workshop cinlug

usando:removendo documentos

> est.remove(); > est.remove({ name: 'brunno' });

Page 41: Mongodb workshop cinlug

o remove() remove (é mêmo?) os documentos que correspondam aos parâmetros de

consulta passados no método

caso seja chamado sem parâmetros, remove todos os elementos de uma coleção

Page 42: Mongodb workshop cinlug

ok, já sei o básico, mas como aproveitar mais o que o

mongoDB oferece?

Page 43: Mongodb workshop cinlug

Agregue seus dados de acordo com o uso

Princípio da Localidade Espacial

Page 44: Mongodb workshop cinlug

Também Binha!

Princípio da Localidade Espacial

Utilizar espaço contíguo no disco para evitar reposicionamento da agulha no disco que é uma operação de alta latência.Caso a agulha seja movida, quanto menor o deslocamento, mais rápido será a operação.

Page 45: Mongodb workshop cinlug

História: Quero mostrar meus posts, os seus comentários com as informações de cada usuário.

Estudo de Caso

Page 46: Mongodb workshop cinlug

Modelo Relacional

post = {'_id': 1, 'titulo': "lambda lambda lambda", 'texto': “Live Long and Prosper!”, 'autor_id': 34}

autor1 = {'_id': 34, 'nome': 'Spock'}

autor2 = {'_id': 33, 'nome': 'Kirk'}

comentario = {'post_id': 1, 'autor_id': 33, 'texto': 'Excelente Spock'}

Page 47: Mongodb workshop cinlug

Como ocorre o acesso ao disco?

Page 48: Mongodb workshop cinlug

Como ocorre o acesso ao disco?

Page 49: Mongodb workshop cinlug

Modelo Não Normalizadopost = {'_id': 1, 'titulo': 'lambda lambda lambda', 'texto': 'era uma vez...', 'autor': {'_id': 1, 'nome': 'spock'}, 'comentarios': [ {'autor': 'kirk', 'texto': 'muito bom!'}]}

Page 50: Mongodb workshop cinlug

E como ocorre o acesso ao disco agora?

Page 51: Mongodb workshop cinlug

Join tables é muito custoso!

$$$

Page 52: Mongodb workshop cinlug

WARNING Dados não normalizados implica na duplicação de dados.

Se os dados da duplicação forem críticos, devem ser atualizado nas múltiplas ocorrências.

Page 53: Mongodb workshop cinlug

WARNING Otimize quando possível.

Quando a duplicação for difícil de ser tratada, normalize seus dados

Page 54: Mongodb workshop cinlug

muito + coisas legais

Page 55: Mongodb workshop cinlug

ÍndicesCriam um atalho para a busca de dados Acesso rápido aos ítens indexados

Page 56: Mongodb workshop cinlug

Índices

db.posts.ensureIndex({'hora': 1});

db.posts.ensureIndex({'autor':1});

Page 57: Mongodb workshop cinlug

Índices fazem o que?

Page 58: Mongodb workshop cinlug

Quando eu devo usar Índices?

Otimizar consultas por um campo específicoOtimizar buscas ordenadasOtimizar buscas dentro de intervalos de valores

Page 59: Mongodb workshop cinlug

Chaves Embarcadas e múltiplas

db.posts.ensureIndex({'comentarios.autor': 1});

Chaves Compostas:

db.factories.insert({ 'name': "General Motors", 'metro': { 'city': "New York", 'state': "NY" } } );db.factories.ensureIndex( { metro : 1 } );

Page 60: Mongodb workshop cinlug

WARNINGNão crie índices sem necessidade, ou para consultas rarasÍndices aumentam o tempo de inserção de documentosAtualização nos documentos com índices demoram +

Page 61: Mongodb workshop cinlug

WARNINGÍndices podem ocupar muita memória Ao criar um índice em uma coleção não vazia, essa operação (por padrão) congelará o processo do mongoDB até concluir a indexação. Utilize:

db.things.ensureIndex( {'x':1},{'background':true});

Page 62: Mongodb workshop cinlug

tem +

Chaves decrescentes Chaves únicas Chaves dropáveis dropIndex reIndex Índices Geoespaciais...

Page 63: Mongodb workshop cinlug

Capped Collections O que são? São coleções sem índices, sem _id e com tamanhos fixos.

db.createCollection('visitas', {'capped':true,'size':100000})

Page 64: Mongodb workshop cinlug

Capped Collections Operações idênticas a uma coleção comum: db.visits.insert({ 'ip':'108.23.47.98', 'timestamp': 1292177707})

db.visits.remove()

Page 65: Mongodb workshop cinlug

Capped CollectionsPara que servem?

Inserção de dados otimizada Rápido para consultas do tipo: as últimasConsultas genéricas são lentasMapReduce mais rápido (mais adiante)

Ex.: Logs, Coleta massiva de dados

Page 66: Mongodb workshop cinlug

Existem N maneiras de fazer uma consulta, Certo?

Mas qual é a mais eficiente? Na dúvida utilize Profiling: db.posts.find().explain()

Profiling

Page 67: Mongodb workshop cinlug

{ 'cursor' : "BasicCursor", --> Tipo de Cursor da consulta 'nscanned' : 1, --> Índices visitados 'nscannedObjects' : 1, --> Objetos visitados 'n' : 14, --> Quantidade de objetos retornados 'millis' : 1, --> Tempo de execução da consulta "indexBounds" : {} --> Range dos índices que foram varridos }

Profiling

Page 68: Mongodb workshop cinlug

É uma Coleção de ArquivosDocumentos > 4MB Armazenar dados binários

ex.: Vídeos, Mapas, ...Esquema chave/valorDisponível através do driver de alguma linguagem.

GridFS

Page 69: Mongodb workshop cinlug

Sharding & Replica

Escalabilidade horizontalFácil adição de shards Sem pontos únicos de rupturaBalanceamento de carga automáticoProcessamento distribuído (MapReduce)

Page 70: Mongodb workshop cinlug

Sharding & Replica

Page 71: Mongodb workshop cinlug

É um modelo de programação criado pelo Google para processar quantidades

massivas de dados,na escala de Terabytes.

Esse modelo permite um escalabilidade horizontal em um cluster de

computadores.

MapReduce

Paper: http://labs.google.com/papers/mapreduce.html

Page 72: Mongodb workshop cinlug

ProblemasConsulta em bases gigantesRecuperação de informaçãoEngenhos de Busca (Yahoo!)Mineração de DadosAnálise de LogsIndicação de Amigos

MapReduce

Page 73: Mongodb workshop cinlug

E como funciona?

MapReduce

Page 74: Mongodb workshop cinlug

1 - Map: Para cada item da entrada executa uma função e retorna um par

<Chave1, Valor1> intermediário.

2 - Reduce: Junte os pares <Chave1,Valor1> com chaves iguais emitidas pela função

anterior, processe e retorne um par <Chave2,Valor2> como resultado final.

MapReduce

Page 75: Mongodb workshop cinlug

1 - Χάρτης: Για κάθε σημείο της εισόδου εκτελεί μια λειτουργία και επιστρέφει ένα ζεύγος

<Βασικά1, αξία1> μεσάζοντα.

2 - Μείωση: Συμμετοχή στο <Βασικά1,αξία1> ζευγάρια με ίσα κλειδιά που εκδίδονται από την

προηγούμενη λειτουργία, διαδικασία και να επιστρέψει ένα <Βασικά2,αξία2> ζεύγος ως το

τελικό αποτέλεσμα.

MapReduce

Page 76: Mongodb workshop cinlug

Na Prática:

Page 77: Mongodb workshop cinlug

map = function() { var words = this.conteudo.split(' '); for(var i = 0; i < words.length; i++) { emit(words[i], {'count': 1,'posts':[this._id]}); }}

MapReduce

Page 78: Mongodb workshop cinlug

reduce = function(word, tags) { var total = 0; var posts = []; for(var i = 0; i < tags.length; i++) { total += tags[i]['count']; posts = posts.concat( tags[i]['posts']); } return {'count': total, 'posts': posts}; }

MapReduce

Page 79: Mongodb workshop cinlug

GO!

db.posts.mapReduce(map,reduce);

MapReduce

Page 80: Mongodb workshop cinlug

Por padrão, o mongodb cria uma coleção temporária: show collections tmp.mr.mapreduce_1282610145_3 Utilizando os drivers da sua linguagem, é possível renomear essa coleção temporária.

MapReduce

Page 81: Mongodb workshop cinlug

...OUCriamos uma função de finalização:

finalize = function(word, tags) { db.tagCloud.insert( {'keyword':word, 'count': tags['count'], 'posts': tags['posts']})}

MapReduce

Page 82: Mongodb workshop cinlug

db.posts.mapReduce(map,reduce, {'finalize':finalize});

MapReduce

Page 83: Mongodb workshop cinlug

mais ?

Page 84: Mongodb workshop cinlug

drivers para:

CC++JavaJavascriptPHPPerlPythonRubyREST C# e .NetClosure ColdFusionDelphiErlang

FactorFantomF#GoGroovyHaskellLuanode.jsObjective CPowershell ScalaSchemeSmalltalk...

Page 85: Mongodb workshop cinlug

mais informações?

http://www.mongodb.org/display/DOCS

http://www.mongodb.org/display/DOCS/Drivers

Page 86: Mongodb workshop cinlug
Page 87: Mongodb workshop cinlug

Brunno Gomes

twitter.com/brunnogomes [email protected]

Page 88: Mongodb workshop cinlug

Daker codecereal.blogspot.com twitter.com/dakerfp

[email protected]

[email protected]