Modelando aplicação em documento
Thiago Avelino
                @avelino0
           www.avelino.us
thiagoavelinoster@gmail.c
                       om
O que é MongoDB?
• Banco de dados não relacional;
• Orientado a documentos;
• Alta Performance;
• Escalavel;
• Schema Aberto
• Open Source
Quem utiliza?
• Github;
• Foursquare;
• bit.ly;
• Zynga;
• T Dispatch;
• Apontador;
• Globo.com;
• Entre outros...
Onde usar?

• web 2.0
• Migrations
• Flexibilidade
• Cache
Drivers
• C, C++
• Erlang
• Java
• JavaScript
• Python
• Ruby
•   Relação completa em:
    http://www.mongodb.org/display/DOCS/Drivers
Modelo de documento


    {‘nome’: ‘Thiago Avelino’,
    ‘empresa’: ‘Mochii’,
    ‘pais’: ‘Londres’}
Modelo de documento
      {‘nome’: ‘Thiago Avelino’,
      ‘empresa’: ‘Mochii’,
      ‘pais’: ‘Londres’}

              Sim é um JSON.
  Fácil de trabalhar com esse modelo de
   dados na maioria das linguagens de
                programação
Migrations
É possóvel fazer mudança dinamica em um
                documento
Migrations
        É possóvel fazer mudança dinamica em um
                        documento

{‘nome’: ‘Thiago
Avelino’,
‘empresa’: ‘Mochii’,
‘local’: ‘Londres’}
Migrations
        É possóvel fazer mudança dinamica em um
                        documento

{‘nome’: ‘Thiago
Avelino’,
‘empresa’: ‘Mochii’,
‘local’: ‘Londres’}
Migrations
        É possóvel fazer mudança dinamica em um
                        documento

{‘nome’: ‘Thiago               {‘nome’: ‘Thiago
Avelino’,                      Avelino’,
‘empresa’: ‘Mochii’,           ‘cargo’: ‘engenheiro de
‘local’: ‘Londres’}            software’,
                               ‘empresa’: ‘Mochii’,
                               ‘local’: ‘Londres’}
Migrations
        É possóvel fazer mudança dinamica em um
                        documento

{‘nome’: ‘Thiago               {‘nome’: ‘Thiago
Avelino’,                      Avelino’,
‘empresa’: ‘Mochii’,           ‘cargo’: ‘engenheiro de
‘local’: ‘Londres’}            software’,
                               ‘empresa’: ‘Mochii’,
                               ‘local’: ‘Londres’}
         Adicionado mais um campo sem mexer em
                       modelagem
Agregadores
db.cadastro.insert({‘local’:
‘Berlin’})
db.cadastro.insert({‘local’:
‘Londres’})
db.cadastro.insert({‘local’:
‘Brasil’})
db.cadastro.insert({‘local’:
‘Berlin’})
Agregadores
db.cadastro.insert({‘local’:
‘Berlin’})
db.cadastro.insert({‘local’:
‘Londres’})
db.cadastro.insert({‘local’:
‘Brasil’})
db.cadastro.insert({‘local’:
     db.cadastro.distinct(‘loca
‘Berlin’})
     l’)
Agregadores
db.cadastro.insert({‘local’:
‘Berlin’})
db.cadastro.insert({‘local’:
‘Londres’})
db.cadastro.insert({‘local’:
‘Brasil’})
     db.cadastro.distinct(‘loca
db.cadastro.insert({‘local’:
     l’)
‘Berlin’})
Agregadores
db.cadastro.insert({‘local’:
‘Berlin’})
db.cadastro.insert({‘local’:
‘Londres’})
db.cadastro.insert({‘local’:
‘Brasil’})
     db.cadastro.distinct(‘loca
db.cadastro.insert({‘local’:
     l’)
‘Berlin’})

     [‘Berlin’, ‘Londres’, ‘Bras
     il’]
Map/Reduce

Utilizado para criar funções dentro do
              MongoDB
       Escrito em JavaScript
Map/Reduce
                        Exemplo


   Salas =     [_id, nome]


Reservas = [_id, sala_id, dat
                   a]

             Descobrir o numero da reserva


             https://gist.github.com/2782117
map = function () {
  emit(this.sala_id, [1]);
}

reduce = function (sala, values) {
  var sum = 0;
  if (values) {
    for (var i = 0; i < values.length; i++) {
      sum += 1;
    }
  }
  return sum;
}
Map/Reduce
                    Exemplo
   db.reservas.mapReduce(map, reduce, {"out":
                  "resultado"})

db.resultado.find({})
{ "_id": ObjectId("4fbd6e69700f6e1266000002"),
"value": 1}
{ "_id": ObjectId("4fbd6e69700f6e1266000004"),
"value": 2}
Índice

    O Conceito é similar a bancos
    relacionais, exemplo MySQL


  db.colecao.ensureIndex({nome:
  1})
db.colecao.ensureIndex({‘endereco.cep’
: 1})
Índice

Lista dos os índice criado:



   db.colecao.getIndex
   ()
Índice
                      Índice unico
    db.colecao.ensureIndex({nome:
    1, sobrenome: 1}, unique: true});


db.colecao.insert({nome:'jane',sobrenome:'doe'}); // ok
db.colecao.insert({nome:'jane',sobrenome:'doe'}); // dup
key
errordb.colecao.insert({nome:'jane',sobrenome:'smith'});
// ok
GridFS
    Armazenamento de arquivos binários
       dentro do MongoDB (Até 4MB)


   Maior controle de permissão de acesso;


http://www.mongodb.org/display/DOCS/GridFS
GridFS
    Armazenamento de arquivos binários
       dentro do MongoDB (Até 4MB)


   Maior controle de permissão de acesso;


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

 HTTP




Aplicaçã         File
    o          system
GridFS

 HTTP       HTTP

                      GridFS




Aplicaçã   Aplicaçã
    o          o
Replica Sets

      Aplicaçã
          o




Node #1
Node #2

             Replica
Replica Sets

      Aplicaçã
          o




Node #1
Node #2
Node #3
             Replica
Replica Sets

      Aplicaçã
          o




Node #1
Node #2
Node #3
             Replica
Sharding

  a-d        e-t       u-z


Node #1    Node #2   Node #3
Modelar aplicação
Casos práticos


Quase tudo no mesmo
documento
Casos práticos


Quase tudo no mesmo
documento

           4MB
Casos práticos


 Dividindo aplicação em
        Collections
Não é fácil controlar muitas
           ObjID
Casos práticos


 Como estamos hoje?
Cloud
Cloud
Suporte Comercial


Marcello Baquero - marcello@10gen.com



     http://www.10gen.com/support
Obrigado!
Perguntas?




                Thiago Avelino
                    @avelino0
               www.avelino.us
    thiagoavelinoster@gmail.c

Modelando aplicação em documento - MongoDB