Wagner Bonfiglio
Navegg




                   Dez / 2011
 Maior empresa brasileira de segmentação de audiência
  online
 Fundada em 2009, comprada pelo Buscapé em fev/201
 Analisa mais de 4 bilhões de visitas por mês
 Mais de 80 milhões de internautas analisados
 Linguagens C, Python e PH
 Bancos de dados MySQL, Redis e MongoDB
 Ambiente Linux
Agenda

   Diferença para SQL
   Documentos
   Querying
   Updating
   Sharding
   Alta Performance
MySQL                    MongoDB

   Tabelas              Collection
   Linhas               Documentos
   Colunas
                         Atributos
   Estrutura definida
   Joins                Estrutura flexível
                         Documentos
                         completos
Todo documento tem a PK “_id”
BSON - Binary JSON

{
    "Dat" : ISODate("2011-12-01T00:21:41.366Z"),
    "Profile" : {
           "1" : NumberLong(1),
           "3" : NumberLong(8),
           "2" : NumberLong(4),
           "5" : [ 20, 11 ]
    },
    "_id" : 10812274
}
Queries dinâmicas
 - SELECT * FROM TABLE
db.Collection.find({})
 - SELECT * FROM TABLE WHERE ID=1
db.Collection.find({_id: 1})
 - SELECT * FROM TABLE WHERE Cond1 = 1 AND Cond2 = "A"
db.Collection.find({Cond1: 1, Cond2: "A"})
 - SELECT * FROM TABLE WHERE Cond1 > 1
db.Collection.find({Cond1: {$gt: 1}})
 - SELECT * FROM TABLE LIMIT 100,10
db.Collection.find().skip(100).limit(10)
 - SELECT count(1) FROM TABLE
db.Collection.count()
 - SELET * FROM TABLE WHERE Cond1 IS NOT NULL
db.Collection.find({Cond1: {$exists: true}})
FindAndModify

> job = db.jobs.findAndModify({
      query: {inprogress: false, task: "calculateProfile"},
      sort: { priority: -1 },
      update: { $set: {inprogress: true, started: new Date() } }
      new: true
});
Map / Reduce
{ interest: [1], _id: 1 }
{ interest: [1,2,5,8], _id: 2 }
{ _id: 3 }

> m = function() {
    if(this.interest)
         this.interest.forEach(function(z){ emit(z,{ count: 1}); });
   else return;
}
> r = function(key, values) {
   var total = 0;
       for ( var i=0; i < values.length; i++ )
        total += values[i].count;
   return { count : total };
}
> db.ProfileDem.mapReduce(m, r, { out : "myoutput" } );
Modificadores
$set
 Seta o documento com os valores passados
$unset
 Limpa o campo
$addToSet
 Adiciona o valor para um array, evitando duplicidade
$push
  Adiciona o valor para um array, podendo duplicar o valor
$inc
  Incrementa um valor inteiro para um campo
db.Collection.update({_id: 1}, {$set: {Name: "Wagner"}}, Upsert=true)

db.Collection.update({_id: 1}, {$unset: { Jobs: 1}})

db.Collection.update({_id: 1}, {$addToSet:
{Events:
    {Name: "Workshop",
     Date: ISODate("2011-12-07"),
     Local: "BuscaPé"}
})

 db.Collection.update({_id: 1}, {$inc: {FestasFimDeAno: 1}})
   Divide documentos entre máquinas
   Critério de divisão definido pelo
    administrador
   Usado com ReplicaSet para garantir
    integridade
       Cada shard é replicado
   Necessário 1 ou 3 config servers
   Usuário se conecta em um servidor que
    busca o dado no shard correto
   Ausência de Joins e documentos completos
    tornam a leitura e escrita mais rápidos


   Índices que indexam qualquer atributo,
    inclusive arrays
Obrigado!

  Wagner Bonfiglio
bonfiglio@navegg.com

MongoDB - Wagner Bonfiglio - Navegg

  • 1.
  • 2.
     Maior empresabrasileira de segmentação de audiência online  Fundada em 2009, comprada pelo Buscapé em fev/201  Analisa mais de 4 bilhões de visitas por mês  Mais de 80 milhões de internautas analisados  Linguagens C, Python e PH  Bancos de dados MySQL, Redis e MongoDB  Ambiente Linux
  • 3.
    Agenda  Diferença para SQL  Documentos  Querying  Updating  Sharding  Alta Performance
  • 4.
    MySQL MongoDB  Tabelas Collection  Linhas Documentos  Colunas Atributos  Estrutura definida  Joins Estrutura flexível Documentos completos
  • 5.
    Todo documento tema PK “_id” BSON - Binary JSON { "Dat" : ISODate("2011-12-01T00:21:41.366Z"), "Profile" : { "1" : NumberLong(1), "3" : NumberLong(8), "2" : NumberLong(4), "5" : [ 20, 11 ] }, "_id" : 10812274 }
  • 6.
    Queries dinâmicas -SELECT * FROM TABLE db.Collection.find({}) - SELECT * FROM TABLE WHERE ID=1 db.Collection.find({_id: 1}) - SELECT * FROM TABLE WHERE Cond1 = 1 AND Cond2 = "A" db.Collection.find({Cond1: 1, Cond2: "A"}) - SELECT * FROM TABLE WHERE Cond1 > 1 db.Collection.find({Cond1: {$gt: 1}}) - SELECT * FROM TABLE LIMIT 100,10 db.Collection.find().skip(100).limit(10) - SELECT count(1) FROM TABLE db.Collection.count() - SELET * FROM TABLE WHERE Cond1 IS NOT NULL db.Collection.find({Cond1: {$exists: true}})
  • 7.
    FindAndModify > job =db.jobs.findAndModify({ query: {inprogress: false, task: "calculateProfile"}, sort: { priority: -1 }, update: { $set: {inprogress: true, started: new Date() } } new: true });
  • 8.
    Map / Reduce {interest: [1], _id: 1 } { interest: [1,2,5,8], _id: 2 } { _id: 3 } > m = function() { if(this.interest) this.interest.forEach(function(z){ emit(z,{ count: 1}); }); else return; } > r = function(key, values) { var total = 0; for ( var i=0; i < values.length; i++ ) total += values[i].count; return { count : total }; } > db.ProfileDem.mapReduce(m, r, { out : "myoutput" } );
  • 9.
    Modificadores $set Seta odocumento com os valores passados $unset Limpa o campo $addToSet Adiciona o valor para um array, evitando duplicidade $push Adiciona o valor para um array, podendo duplicar o valor $inc Incrementa um valor inteiro para um campo
  • 10.
    db.Collection.update({_id: 1}, {$set:{Name: "Wagner"}}, Upsert=true) db.Collection.update({_id: 1}, {$unset: { Jobs: 1}}) db.Collection.update({_id: 1}, {$addToSet: {Events: {Name: "Workshop", Date: ISODate("2011-12-07"), Local: "BuscaPé"} }) db.Collection.update({_id: 1}, {$inc: {FestasFimDeAno: 1}})
  • 11.
    Divide documentos entre máquinas  Critério de divisão definido pelo administrador  Usado com ReplicaSet para garantir integridade  Cada shard é replicado  Necessário 1 ou 3 config servers  Usuário se conecta em um servidor que busca o dado no shard correto
  • 13.
    Ausência de Joins e documentos completos tornam a leitura e escrita mais rápidos  Índices que indexam qualquer atributo, inclusive arrays
  • 14.
    Obrigado! WagnerBonfiglio bonfiglio@navegg.com