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
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