SlideShare uma empresa Scribd logo
http://cinlug-br.org/
Mongodb workshop cinlug
De acordo com o mongoDB.org:

  “Banco de dados escalável, de alta-
performance, open-source, schema-free,
       orientado-a-documentos.”
documentos
{nome: 'mongo', tipo: 'BD'}
JSON ?
hash   array
  JSON !
  dicionário
schema-free ?
tipagem dinâmica
migrations de graça
ainda posso usar índices
migrations ?
apenas faça:

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


{nome: 'mongo', tipo: 'BD', versao: 1.6}
coisas que podem
    fazer falta
As propriedades ACID ficam na
     mão do programador
Relembrando ACID
 São 4 propriedades que os BDs tradicionais fornecem
 às aplicações:

Atomicity
   Garante que um conjunto de modificações seja
   realizado por completo ou nada é feito
Consistency
   Garante que o banco não está em um estado
   inconsistente
Isolation
    Dados que estão durante operação são inacessíveis
Durability
   Garantia de qua transação só é finalizada quando está
   salva no disco
usando o mongoDB

a partir do Terminal
instalando:
> http://www.mongodb.org/downloads

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

> descompacte (dezipe, desenrare)

> só isso mesmo...
WARNING
As versões de 32-bits do mongoDB
são limitadas a uns 2.5 GB de dados
Oxe, porque?
Como o foco dele é em performance,
ele usa um sistema de mapeamento
de arquivos em memória em alguns
momentos, logo...
usando:

> bin/mongod   <- servidor

> bin/mongo    <- cliente
usando:

    o cliente (vulgo shell) é baseado em
                  Javascript


  então podemos fazer qualquer coisa (que
faríamos com Javascript num terminal, claro)
usando:
> n1 = 5;

> n2 = 8;

> if (n2 > n1) {
   menor = n1;
  } else {
   menor = n2;
  }
usando:
       criando um documento


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

        salvando na coleção


> db.estudantes.insert(estudante);
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
usando:
     escolhendo base e coleção


> show dbs;

> use nomedabase;

> show collections;

> db.nomedacolecao.metodo();
usando:
        podemos usar atalhos


> est = db.estudantes;

> est.insert({nome: 'daker', nota: 10});
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).
usando:

       resgatando documentos


> db.estudantes.find();
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
usando:
       resgatando documentos


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

> est.find({nota: { '$gt': 7});
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'
usando:

              o findOne()


> est.findOne({nota: 7});
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
usando:
     atualizando um documento


> est.update({ name: 'brunno'},
             { name: 'brunno,
               nota: 10 });
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
usando:
       atualizando um documento


> est.update({ name: 'brunno' },
             { $set: { nota: 8 } });
o $set define o valor 8 no campo nota

caso 'nota' não exista, é criado com valor 8
usando:
       atualizando um documento


> est.update({ name: 'brunno' },
             { $push: { cadeira: 'p1' } });
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
usando:
       removendo documentos


> est.remove();

> est.remove({ name: 'brunno' });
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
ok, já sei o básico, mas como
   aproveitar mais o que o
      mongoDB oferece?
Agregue seus dados de acordo
com o uso


       Princípio da Localidade
                      Espacial
Princípio da Localidade
             Espacial
                  Também Binha!




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.
Estudo de Caso

História: Quero mostrar meus
posts, os seus comentários
com as informações de cada
usuário.
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'}
Como ocorre o acesso ao
disco?
Como ocorre o acesso ao
disco?
Modelo Não Normalizado
post = {'_id': 1,
    'titulo': 'lambda lambda lambda',
    'texto': 'era uma vez...',
    'autor': {'_id': 1, 'nome': 'spock'},
    'comentarios': [
        {'autor': 'kirk',
        'texto': 'muito bom!'}
]}
E como ocorre o acesso ao
disco agora?
Join tables é
muito custoso!
    $$$
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.
WARNING
 Otimize quando possível.

   Quando a duplicação for
difícil de ser tratada, normalize
seus dados
muito + coisas
    legais
Índices
Criam um atalho para a busca
de dados

Acesso rápido aos ítens
indexados
Índices

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

db.posts.ensureIndex({'autor':1});
Índices fazem o que?
Quando eu devo usar
     Índices?

Otimizar consultas por um campo
específico
Otimizar buscas ordenadas
Otimizar buscas dentro de intervalos
de valores
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 } );
WARNING
Não crie índices sem necessidade, ou para
consultas raras
Índices aumentam o tempo de inserção de
documentos
Atualização nos documentos com índices
demoram +
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});
tem +
Chaves decrescentes
Chaves únicas
Chaves dropáveis
dropIndex
reIndex
Índices Geoespaciais
...
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})
Capped Collections
Operações idênticas a uma coleção comum:

db.visits.insert({
    'ip':'108.23.47.98',
    'timestamp': 1292177707})

db.visits.remove()
Capped Collections
Para que servem?

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

  Ex.: Logs, Coleta massiva de dados
Profiling

  Existem N maneiras de fazer uma
consulta, Certo?

               Mas qual é a mais eficiente?

Na dúvida utilize Profiling:

    db.posts.find().explain()
Profiling
{
    '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
}
GridFS
É uma Coleção de Arquivos
  Documentos > 4MB
  Armazenar dados binários
     ex.: Vídeos, Mapas, ...
  Esquema chave/valor
  Disponível através do driver de alguma
  linguagem.
Sharding & Replica
Escalabilidade horizontal
Fácil adição de shards
Sem pontos únicos de ruptura
Balanceamento de carga automático
Processamento distribuído
(MapReduce)
Sharding & Replica
MapReduce
 É 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.

Paper: http://labs.google.com/papers/mapreduce.html
MapReduce
              Problemas
Consulta em bases gigantes
Recuperação de informação
Engenhos de Busca (Yahoo!)
Mineração de Dados
Análise de Logs
Indicação de Amigos
MapReduce

E como funciona?
MapReduce
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
1 - Χάρτης: Για κάθε σημείο της εισόδου εκτελεί
    μια λειτουργία και επιστρέφει ένα ζεύγος
         <Βασικά1, αξία1> μεσάζοντα.

 2 - Μείωση: Συμμετοχή στο <Βασικά1,αξία1>
ζευγάρια με ίσα κλειδιά που εκδίδονται από την
  προηγούμενη λειτουργία, διαδικασία και να
επιστρέψει ένα <Βασικά2,αξία2> ζεύγος ως το
              τελικό αποτέλεσμα.
Na Prática:
MapReduce
map = function() {
    var words = this.conteudo.split(' ');
    for(var i = 0; i < words.length; i++)
{           emit(words[i],
        {'count': 1,'posts':[this._id]});
    }
}
MapReduce
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

           GO!
db.posts.mapReduce(map,reduce);
MapReduce
   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
                ...OU
Criamos uma função de finalização:

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

db.posts.mapReduce(map,reduce,
    {'finalize':finalize});
mais ?
drivers para:

C                  Factor
C++                Fantom
Java               F#
Javascript         Go
PHP                Groovy
Perl               Haskell
Python             Lua
Ruby               node.js
REST               Objective C
C# e .Net          Powershell
Closure            Scala
ColdFusion         Scheme
Delphi             Smalltalk
Erlang             ...
mais informações?

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

http://www.mongodb.org/display/DOCS/Drivers
Mongodb workshop cinlug
Brunno Gomes

 twitter.com/brunnogomes
   brunnolgp@gmail.com
Daker
codecereal.blogspot.com

twitter.com/dakerfp

dfp@cin.ufpe.br

daker.pinheiro@openbossa.org

Mais conteúdo relacionado

Mais procurados (20)

PDF
Python e bancos NoSQL
Marinho Brandão
 
PPTX
#5 CRUD no MongoDB
Gabriel Alves Scavassa
 
PDF
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Big Data Week São Paulo
 
ODP
Palestra2009
Rildo Pragana
 
PPT
Bd sql (1)
jheyeizah
 
ODP
Palestra cbq
Rildo Pragana
 
PDF
Aula 2 - Comandos DDL DML DQL E DCL
César Augusto Pessôa
 
PDF
Introdução ao MongoDB
Elaine Naomi
 
PPTX
Desenvolvimento de aplicações PHP com MongoDB
Ari Stopassola Junior
 
PDF
Turbinando o desenvolvimento Android com Kotlin
Nelson Glauber Leal
 
PDF
Mongo DB
dist_bp
 
PDF
Java 05
samuelthiago
 
PDF
Persistência de Dados no SQLite com Room
Nelson Glauber Leal
 
PDF
String e IO
Elenilson Vieira
 
PPTX
MongoDB: Uma forma diferente de pensar no desenvolvimento
Marcos Thomaz
 
KEY
NoSQL e MongoDB - ETEC
Jefferson Queiroz
 
PDF
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Jorge Luís Gregório
 
PPT
Desenvolvendo soluções com banco de dados não relacional - MongoDB
iMasters
 
PPTX
Introdução ao MongoDB
Eng. Carlos Eduardo Ferreiro Corrêa
 
PDF
Arquitetura de Memoria do PostgreSQL
Raul Oliveira
 
Python e bancos NoSQL
Marinho Brandão
 
#5 CRUD no MongoDB
Gabriel Alves Scavassa
 
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Big Data Week São Paulo
 
Palestra2009
Rildo Pragana
 
Bd sql (1)
jheyeizah
 
Palestra cbq
Rildo Pragana
 
Aula 2 - Comandos DDL DML DQL E DCL
César Augusto Pessôa
 
Introdução ao MongoDB
Elaine Naomi
 
Desenvolvimento de aplicações PHP com MongoDB
Ari Stopassola Junior
 
Turbinando o desenvolvimento Android com Kotlin
Nelson Glauber Leal
 
Mongo DB
dist_bp
 
Java 05
samuelthiago
 
Persistência de Dados no SQLite com Room
Nelson Glauber Leal
 
String e IO
Elenilson Vieira
 
MongoDB: Uma forma diferente de pensar no desenvolvimento
Marcos Thomaz
 
NoSQL e MongoDB - ETEC
Jefferson Queiroz
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Jorge Luís Gregório
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
iMasters
 
Introdução ao MongoDB
Eng. Carlos Eduardo Ferreiro Corrêa
 
Arquitetura de Memoria do PostgreSQL
Raul Oliveira
 

Destaque (8)

PDF
QtQuick - WSL II
Daker Fernandes
 
PDF
Dominando Modelos Ocultos de Markov com Python e GHMM
Daker Fernandes
 
PDF
CITi - PySide
Daker Fernandes
 
PDF
Plasmaquick Workshop - FISL 13
Daker Fernandes
 
PDF
Opengl aula-01
Daker Fernandes
 
PDF
Raspberry Pi + Python
Daker Fernandes
 
PDF
Why is Python slow? Python Nordeste 2013
Daker Fernandes
 
PDF
Jogos em Qt
Daker Fernandes
 
QtQuick - WSL II
Daker Fernandes
 
Dominando Modelos Ocultos de Markov com Python e GHMM
Daker Fernandes
 
CITi - PySide
Daker Fernandes
 
Plasmaquick Workshop - FISL 13
Daker Fernandes
 
Opengl aula-01
Daker Fernandes
 
Raspberry Pi + Python
Daker Fernandes
 
Why is Python slow? Python Nordeste 2013
Daker Fernandes
 
Jogos em Qt
Daker Fernandes
 
Anúncio

Semelhante a Mongodb workshop cinlug (20)

PPTX
Workshop MongoDB
Leonardo Loures Quirino
 
PDF
Mongo db slides
Terra / Neo
 
KEY
MongoDB - Apresentação
Terra / Neo
 
ODP
MongoDB
Patrick Espake
 
PDF
Introdução ao MongoDB em 30 slides
Derek Willian Stavis
 
PDF
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
ISCTE-IUL ACM Student Chapter
 
ODP
MongoDB - Tudo que você precisa saber - FGSL 2014
Christiano Anderson
 
ODP
MongoDB - Tudo o que você precisa saber - FISL16
Christiano Anderson
 
PDF
MongoDB: um banco de dados orientado a documento
Julio Monteiro
 
PPTX
Mongo db
Edmilson Neto
 
PDF
Minicurso Introdução ao mongoDB SCTI
Bruna Pereira
 
PPT
Palestra MongoDB
James G Silva
 
PDF
mongodb.pdf
NlioCorreia
 
PPTX
MongoDB Aggregation Framework
Leandro Domingues
 
PPT
Introdução ao MongoDB
Rodrigo Hjort
 
PDF
Introdução ao MongoDB: conceitos e práticas
Bruno Barreto Carvalho
 
PPT
Mongo Db - PHP Day Workshop
Diego Sana
 
PDF
Coisas que aprendemos usando Mongoid com grande quantidade de dados
fabio perrella
 
PDF
Introdução ao no sql e mongodb
Universidade Federal Rural do Semi Arido
 
PPT
Modelando aplicação em documento - MongoDB
Thiago Avelino
 
Workshop MongoDB
Leonardo Loures Quirino
 
Mongo db slides
Terra / Neo
 
MongoDB - Apresentação
Terra / Neo
 
Introdução ao MongoDB em 30 slides
Derek Willian Stavis
 
acm, chapter, development, events, iscte, portugal, opensource, softwareApres...
ISCTE-IUL ACM Student Chapter
 
MongoDB - Tudo que você precisa saber - FGSL 2014
Christiano Anderson
 
MongoDB - Tudo o que você precisa saber - FISL16
Christiano Anderson
 
MongoDB: um banco de dados orientado a documento
Julio Monteiro
 
Mongo db
Edmilson Neto
 
Minicurso Introdução ao mongoDB SCTI
Bruna Pereira
 
Palestra MongoDB
James G Silva
 
mongodb.pdf
NlioCorreia
 
MongoDB Aggregation Framework
Leandro Domingues
 
Introdução ao MongoDB
Rodrigo Hjort
 
Introdução ao MongoDB: conceitos e práticas
Bruno Barreto Carvalho
 
Mongo Db - PHP Day Workshop
Diego Sana
 
Coisas que aprendemos usando Mongoid com grande quantidade de dados
fabio perrella
 
Introdução ao no sql e mongodb
Universidade Federal Rural do Semi Arido
 
Modelando aplicação em documento - MongoDB
Thiago Avelino
 
Anúncio

Mongodb workshop cinlug

  • 3. De acordo com o mongoDB.org: “Banco de dados escalável, de alta- performance, open-source, schema-free, orientado-a-documentos.”
  • 7. hash array JSON ! dicionário
  • 9. tipagem dinâmica migrations de graça ainda posso usar índices
  • 11. apenas faça: {nome: 'mongo', tipo: 'BD'} {nome: 'mongo', tipo: 'BD', versao: 1.6}
  • 12. coisas que podem fazer falta
  • 13. As propriedades ACID ficam na mão do programador
  • 14. Relembrando ACID São 4 propriedades que os BDs tradicionais fornecem às aplicações: Atomicity Garante que um conjunto de modificações seja realizado por completo ou nada é feito Consistency Garante que o banco não está em um estado inconsistente Isolation Dados que estão durante operação são inacessíveis Durability Garantia de qua transação só é finalizada quando está salva no disco
  • 15. usando o mongoDB a partir do Terminal
  • 16. instalando: > http://www.mongodb.org/downloads > escolha a versão adequada ao seu SO e arq (32-bits / 64-bits) (32 > descompacte (dezipe, desenrare) > só isso mesmo...
  • 17. WARNING As versões de 32-bits do mongoDB são limitadas a uns 2.5 GB de dados
  • 18. Oxe, porque? Como o foco dele é em performance, ele usa um sistema de mapeamento de arquivos em memória em alguns momentos, logo...
  • 19. usando: > bin/mongod <- servidor > bin/mongo <- cliente
  • 20. usando: o cliente (vulgo shell) é baseado em Javascript então podemos fazer qualquer coisa (que faríamos com Javascript num terminal, claro)
  • 21. usando: > n1 = 5; > n2 = 8; > if (n2 > n1) { menor = n1; } else { menor = n2; }
  • 22. usando: criando um documento > estudante = {nome: 'brunno', nota: 6};
  • 23. usando: salvando na coleção > db.estudantes.insert(estudante);
  • 24. 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
  • 25. usando: escolhendo base e coleção > show dbs; > use nomedabase; > show collections; > db.nomedacolecao.metodo();
  • 26. usando: podemos usar atalhos > est = db.estudantes; > est.insert({nome: 'daker', nota: 10});
  • 27. 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).
  • 28. usando: resgatando documentos > db.estudantes.find();
  • 29. 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
  • 30. usando: resgatando documentos > est.find({nota: 7}); > est.find({nota: { '$gt': 7});
  • 31. 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'
  • 32. usando: o findOne() > est.findOne({nota: 7});
  • 33. 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
  • 34. usando: atualizando um documento > est.update({ name: 'brunno'}, { name: 'brunno, nota: 10 });
  • 35. 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
  • 36. usando: atualizando um documento > est.update({ name: 'brunno' }, { $set: { nota: 8 } });
  • 37. o $set define o valor 8 no campo nota caso 'nota' não exista, é criado com valor 8
  • 38. usando: atualizando um documento > est.update({ name: 'brunno' }, { $push: { cadeira: 'p1' } });
  • 39. 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
  • 40. usando: removendo documentos > est.remove(); > est.remove({ name: 'brunno' });
  • 41. 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
  • 42. ok, já sei o básico, mas como aproveitar mais o que o mongoDB oferece?
  • 43. Agregue seus dados de acordo com o uso Princípio da Localidade Espacial
  • 44. Princípio da Localidade Espacial Também Binha! 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.
  • 45. Estudo de Caso História: Quero mostrar meus posts, os seus comentários com as informações de cada usuário.
  • 46. 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'}
  • 47. Como ocorre o acesso ao disco?
  • 48. Como ocorre o acesso ao disco?
  • 49. Modelo Não Normalizado post = {'_id': 1, 'titulo': 'lambda lambda lambda', 'texto': 'era uma vez...', 'autor': {'_id': 1, 'nome': 'spock'}, 'comentarios': [ {'autor': 'kirk', 'texto': 'muito bom!'} ]}
  • 50. E como ocorre o acesso ao disco agora?
  • 51. Join tables é muito custoso! $$$
  • 52. 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.
  • 53. WARNING Otimize quando possível. Quando a duplicação for difícil de ser tratada, normalize seus dados
  • 54. muito + coisas legais
  • 55. Índices Criam um atalho para a busca de dados Acesso rápido aos ítens indexados
  • 58. Quando eu devo usar Índices? Otimizar consultas por um campo específico Otimizar buscas ordenadas Otimizar buscas dentro de intervalos de valores
  • 59. 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 } );
  • 60. WARNING Não crie índices sem necessidade, ou para consultas raras Índices aumentam o tempo de inserção de documentos Atualização nos documentos com índices demoram +
  • 61. 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});
  • 62. tem + Chaves decrescentes Chaves únicas Chaves dropáveis dropIndex reIndex Índices Geoespaciais ...
  • 63. 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})
  • 64. Capped Collections Operações idênticas a uma coleção comum: db.visits.insert({ 'ip':'108.23.47.98', 'timestamp': 1292177707}) db.visits.remove()
  • 65. Capped Collections Para que servem? Inserção de dados otimizada Rápido para consultas do tipo: as últimas Consultas genéricas são lentas MapReduce mais rápido (mais adiante) Ex.: Logs, Coleta massiva de dados
  • 66. Profiling Existem N maneiras de fazer uma consulta, Certo? Mas qual é a mais eficiente? Na dúvida utilize Profiling: db.posts.find().explain()
  • 67. Profiling { '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 }
  • 68. GridFS É uma Coleção de Arquivos Documentos > 4MB Armazenar dados binários ex.: Vídeos, Mapas, ... Esquema chave/valor Disponível através do driver de alguma linguagem.
  • 69. Sharding & Replica Escalabilidade horizontal Fácil adição de shards Sem pontos únicos de ruptura Balanceamento de carga automático Processamento distribuído (MapReduce)
  • 71. MapReduce É 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. Paper: http://labs.google.com/papers/mapreduce.html
  • 72. MapReduce Problemas Consulta em bases gigantes Recuperação de informação Engenhos de Busca (Yahoo!) Mineração de Dados Análise de Logs Indicação de Amigos
  • 74. MapReduce 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.
  • 75. MapReduce 1 - Χάρτης: Για κάθε σημείο της εισόδου εκτελεί μια λειτουργία και επιστρέφει ένα ζεύγος <Βασικά1, αξία1> μεσάζοντα. 2 - Μείωση: Συμμετοχή στο <Βασικά1,αξία1> ζευγάρια με ίσα κλειδιά που εκδίδονται από την προηγούμενη λειτουργία, διαδικασία και να επιστρέψει ένα <Βασικά2,αξία2> ζεύγος ως το τελικό αποτέλεσμα.
  • 77. MapReduce map = function() { var words = this.conteudo.split(' '); for(var i = 0; i < words.length; i++) { emit(words[i], {'count': 1,'posts':[this._id]}); } }
  • 78. MapReduce 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}; }
  • 79. MapReduce GO! db.posts.mapReduce(map,reduce);
  • 80. MapReduce 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.
  • 81. MapReduce ...OU Criamos uma função de finalização: finalize = function(word, tags) { db.tagCloud.insert( {'keyword':word, 'count': tags['count'], tags['posts']}) }
  • 82. MapReduce db.posts.mapReduce(map,reduce, {'finalize':finalize});
  • 84. drivers para: C Factor C++ Fantom Java F# Javascript Go PHP Groovy Perl Haskell Python Lua Ruby node.js REST Objective C C# e .Net Powershell Closure Scala ColdFusion Scheme Delphi Smalltalk Erlang ...
  • 85. mais informações? http://www.mongodb.org/display/DOCS http://www.mongodb.org/display/DOCS/Drivers