14
Wagner Bonfiglio Navegg Dez / 2011

MongoDB - Wagner Bonfiglio - Navegg

Embed Size (px)

DESCRIPTION

 

Citation preview

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

MongoDB

Collection

Documentos

Atributos

Estrutura flexível

Documentos completos

MySQL

Tabelas Linhas Colunas Estrutura definida Joins

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 [email protected]