Tudo o que você precisa saber 
FGSL - 2014 
Christiano Anderson 
chris@christiano.me 
http://christiano.me 
Twitter: @dump
Quem sou? 
● Arquiteto de dados na Propus; 
● Trabalho com web e software livre 
desde 1995; 
● Python desde 2000; 
● Mong...
Mongo? 
● Sim, em muitos idiomas pode ser um termo 
pejorativo, mas a origem vem de: 
Humongous 
“Gigantesco”
História 
● Foi criado pelos fundadores da Doubleclick; 
● 10gen foi fundada em 2007; 
● A ideia inicial era fazer um prod...
Alta curva de crescimento 
Contribuições ao core do MongoDB
Grandes players utilizando 
● Foursquare; 
● Github; 
● EA Games; 
● Entre diversos outros 
– No Brasil: 
● EasyTaxi; 
● G...
Um pouco de conceitos... 
● NoSQL: O termo foi criado por Carlo Strozzi e 
Eric Evans como referência a um tipo de 
armaze...
Por que usar NoSQL? 
● Novos paradigmas (nem tão novos assim); 
● Funcionalidades; 
● Escalabilidade; 
● Performance; 
● N...
Volume de dados 
● Grande volume é relativo, o que você 
considera grande? 
– Dados que crescem exponencialmente; 
– Agreg...
Considere uso de MongoDB se... 
● Está usando muito cache em sua aplicação; 
● Os dados mudam muito; 
● Os dados estão cre...
Iniciando com MongoDB 
● Sua distribuição GNU/Linux deve possuir 
pacotes prontos; 
● No site da MongoDB, possível baixar ...
Pode substituir o banco relacional? 
● Até pode, mas é uma questão de arquitetura e 
escolhas; 
● Uma aplicação pode usar ...
Não existe a melhor ferramenta... 
… Existe a que atende melhor a sua necessidade. 
A necessidade pode exigir mais de uma ...
Suporte a linguagens de 
programação 
● Praticamente todas as linguagens de programação possuem 
suporte (driver) para Mon...
Recursos animais! 
● Busca textual (Full Text Search); 
● Aggregation framework; 
● Índices espaciais (geográficos); 
● Sh...
Busca textual 
● Possui suporte a português do Brasil; 
● Stemming; 
● Stopwords;
Stemming 
● Se a frase abaixo estiver indexada como FTS: 
“Enquanto houver vontade de lutar, haverá 
esperança de vencer” ...
Interface em JavaScript 
● O MongoShell é baseado em JavaScript, 
oferece toda flexibilidade para gerenciar o 
banco de da...
Nomenclaturas 
Banco Relacional MongoDB 
Base de dados --> Base de Dados 
Tabela --> Coleção 
Registro --> Documento 
Índi...
Modelo de documento 
{'nome':'Christiano', 
'sobrenome':'Anderson', 
'email':'chris@christiano.me', 
'twitter':'@dump', 
'...
Realizando operações via 
MongoShell 
● O MongoDB é implícito, não existe 
necessidade de criar toda estrutura do banco 
d...
MongoShell 
anderson@endor:~$ mongo 
MongoDB shell version: 2.4.6 
connecting to: test 
> a = 10 
10 
> b = 30 
30 
> a < ...
Vamos lá... 
anderson@endor:~$ mongo 
MongoDB shell version: 2.4.6 
connecting to: test 
> use escola 
switched to db esco...
Inserindo um registro 
anderson@endor:~$ mongo 
MongoDB shell version: 2.4.6 
connecting to: test 
> use escola 
switched ...
Verificando o registro 
> db.alunos.findOne() 
{ 
"_id" : ObjectId("525ecd6585512f4130afd2c4"), 
"nome" : "Rolando Rocha",...
Inserindo outro registro 
> db.alunos.insert({ 
... nome: 'Carolina', 
... sobrenome: 'Ferreira', 
... sexo: 'feminino', 
...
Listando apenas o registro da 
Carolina 
> db.alunos.find({'nome':'Carolina'}).pretty() 
{ 
"_id" : ObjectId("522f25248434...
Só mais um registro... 
> db.alunos.insert({ 
... nome: 'Juliana', 
... sobrenome: 'Silva', 
... sexo: 'feminino', 
... id...
Listando apenas quem é do sexo 
feminino 
> db.alunos.find({sexo:'feminino'}) 
{ "_id" : ObjectId("5230ee7ec3141857756a81a...
Listando apenas quem tem 
MongoDB na matéria 
> db.alunos.find({materias:'MongoDB'}) 
{ "_id" : ObjectId("522f25248434c181...
Listando quem tem menos de 30 
anos 
> db.alunos.find({idade: {$lt: 30} }) 
{ "_id" : ObjectId("522f25248434c181910716ec")...
Alguns operadores de consulta 
Operador Descrição 
$gt Maior que 
$gte Maior ou igual que 
$lt Menor que 
$lte Menor ou ig...
Atualização de registro 
Padrão de pesquisa 
> db.alunos.update({'nome':'Carolina'}, 
{$set: {'sobrenome':'Ferreira Martin...
Resultado 
> db.alunos.find({'nome':'Carolina'}).pretty() 
{ 
"_id" : ObjectId("522f2b998434c181910716ee"), 
"email" : "ca...
O que acontece se fizer isso? 
> db.alunos.update({'nome':'Carolina'}, 
{'sobrenome':'Ferreira Martins'})
Removendo registros 
db.alunos.remove({'sobrenome':'Ferreira Martins'})
Listando só o nome dos alunos 
> db.alunos.find({},{'nome':true, '_id': false}) 
{ "nome" : "Rolando" } 
{ "nome" : "Julia...
Ordenação 
> db.alunos.find({}, {'nome': true, '_id': false}).sort({nome: 1}) 
{ "nome" : "Carolina" } 
{ "nome" : "Julian...
Comparativo SQL 
SQL MongoDB 
INSERT INTO USERS VALUES(1,1) db.users.insert({a:1, b:1}) 
SELECT a,b FROM users db.users.fi...
Comparativo SQL 
SQL MongoDB 
SELECT * FROM users WHERE age=33 
ORDER BY name 
db.users.find({‘age’:33}).sort({na 
me:1}) ...
Como descobrir documentos que 
não possuem determinada chave 
> db.alunos.find({'email': {$exists: false} })
Adicionando chave em todos os 
documentos 
Query 
> db.alunos.update({ }, 
{ $set: { 'aprovado': true } }, 
{ multi: true ...
Criando apontamentos 
(relacionamentos) 
> db.alunos.find().pretty() 
{ "_id" : "rolando", "nome" : "Rolando", "email" : "...
Primeiro cenário 
> db.alunos.update({'_id':'rolando'},{$set:{'biblioteca_id': 
['0001','0002']}}) 
> db.alunos.find({'_id...
Explicação primeiro cenário 
● Adicionado à coleção de ALUNOS uma chave 
chamada biblioteca_id; 
● Facilita a pesquisa de ...
Segundo cenário 
> db.biblioteca.update({'_id':'0001'}, 
{$set:{'aluguel': 
{'aluno_id':'rolando','data':'2013-09-09'}}}) ...
Explicação segundo cenário 
● Adicionada uma chave “aluguel” dentro da coleção 
biblioteca; 
● Todos livros alugados possu...
Terceiro cenário 
● Criar uma collection de referência, exemplo: 
“aluguel_livros” e relacionar o _id do aluno com 
_id do...
Aplicação de blog no MongoDB, casamento 
perfeito!!!
{ 
"_id" : ObjectId("541f6a9092a2ee25fedaa655"), 
"titulo" : "Aqui é o título", 
"tags" : [ 
"teste", 
"exemplo", 
"mongod...
Guardar logs, séries temporais e muitos 
documentos pequenos, também tem uma 
modelagem específica para isso. 
Pense nas p...
Série temporal 
timestamp memoria_usada 
2013-10-10T23:06:37.000Z 1000000 
2013-10-10T23:06:38.000Z 2000000 
2013-10-10T23...
A principal pergunta: 
Como você vai buscar esses dados? 
Vai agregar por horas, dia, mês?
Documentos únicos 
{ 
timestamp: ISODate("2013-10-10T23:06:37.000Z"), 
type: ”memory_used”, 
value: 1000000 
}, 
{ 
timest...
Documentos únicos 
● Um dia possui 86.400 segundos; 
● 86.400 documentos por dia na coleção; 
● Se quiser pegar o históric...
Agregado por minuto 
{ 
timestamp_minute: ISODate("2013-10- 
10T23:06:00.000Z"), 
type: “memory_used”, 
values: { 
0: 9999...
Documentos agregados por minuto 
● Um dia possui 1.440 minutos; 
● 1.440 documentos por dia na coleção; 
● Se quiser pegar...
Agregado por hora 
{ 
timestamp_hour: ISODate("2013-10- 
10T23:00:00.000Z"), 
type: “memory_used”, 
values: { 
0: 999999, ...
Documentos agregados por hora 
● Um dia possui 24 horas; 
● 24 documentos por dia na coleção; 
● Se quiser pegar o históri...
Melhor schema 
A pergunta de ouro: 
Como buscar o maior número de informações 
com menor número de queries (de preferência...
Melhor schema 
● Eficiência na gravação 
● Eficiência na leitura 
● Não existe mágica, é necessário entender o 
funcioname...
Conclusão 
● É um novo paradigma, evite pensar de forma 
relacional, senão o projeto ficará engessado; 
● Pode parecer est...
Perguntas??? 
Obrigado!!! Se não deu tempo de responder sua 
pergunta, me chame nas redes sociais ou pelos 
corredores do ...
Próximos SlideShares
Carregando em…5
×

MongoDB - Tudo que você precisa saber - FGSL 2014

1.187 visualizações

Publicada em

MongoDB - Tudo o que você precisa saber - Versão atualizada para o XI Fórum Goiano de Software Livre 2014.

Publicada em: Tecnologia
0 comentários
3 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.187
No SlideShare
0
A partir de incorporações
0
Número de incorporações
304
Ações
Compartilhamentos
0
Downloads
36
Comentários
0
Gostaram
3
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

MongoDB - Tudo que você precisa saber - FGSL 2014

  1. 1. Tudo o que você precisa saber FGSL - 2014 Christiano Anderson chris@christiano.me http://christiano.me Twitter: @dump
  2. 2. Quem sou? ● Arquiteto de dados na Propus; ● Trabalho com web e software livre desde 1995; ● Python desde 2000; ● MongoDB desde o início do projeto; ● Colaboro e já colaborei com projetos como: – GNU Project (Free Software Foundation); – Debian Project; – Python; – MongoDB – MUG - SP; ● Twitter: @dump ● Blog: http://christiano.me ● Facebook, LinkedIn: Christiano Anderson
  3. 3. Mongo? ● Sim, em muitos idiomas pode ser um termo pejorativo, mas a origem vem de: Humongous “Gigantesco”
  4. 4. História ● Foi criado pelos fundadores da Doubleclick; ● 10gen foi fundada em 2007; ● A ideia inicial era fazer um produto semelhante ao Google App Engine;
  5. 5. Alta curva de crescimento Contribuições ao core do MongoDB
  6. 6. Grandes players utilizando ● Foursquare; ● Github; ● EA Games; ● Entre diversos outros – No Brasil: ● EasyTaxi; ● Globo.com; ● IG; ● Mercado Livre ● ZAP Imóveis ● Ingresse.com ● Terra Networks
  7. 7. Um pouco de conceitos... ● NoSQL: O termo foi criado por Carlo Strozzi e Eric Evans como referência a um tipo de armazenamento de dados; ● Nunca, mas nunca está relacionado a ódio ao modelo SQL, pelo contrário, podem até trabalhar em conjunto; ● O termo NoREL e Não Relacional também é bastante utilizado
  8. 8. Por que usar NoSQL? ● Novos paradigmas (nem tão novos assim); ● Funcionalidades; ● Escalabilidade; ● Performance; ● Não ficar preso a modelagem;
  9. 9. Volume de dados ● Grande volume é relativo, o que você considera grande? – Dados que crescem exponencialmente; – Agregam muitos valores dinamicamente; – Não precisam de modelagem;
  10. 10. Considere uso de MongoDB se... ● Está usando muito cache em sua aplicação; ● Os dados mudam muito; ● Os dados estão crescendo de forma exponencial; ● Precisa de processamento em tempo real; ● Gosta de desenvolvimento ágil; ● Sua aplicação é “beta perpétua”; ● Tem dificuldade para trabalhar com modelo relacional; ● Usa muito “join” na sua aplicação relacional;
  11. 11. Iniciando com MongoDB ● Sua distribuição GNU/Linux deve possuir pacotes prontos; ● No site da MongoDB, possível baixar binários para outros sistemas operacionais; ● A instalação é bem simples, a configuração padrão do MongoDB já atende quase todos os cenários;
  12. 12. Pode substituir o banco relacional? ● Até pode, mas é uma questão de arquitetura e escolhas; ● Uma aplicação pode usar MongoDB e banco relacional; ● Tudo vai depender da sua arquitetura;
  13. 13. Não existe a melhor ferramenta... … Existe a que atende melhor a sua necessidade. A necessidade pode exigir mais de uma ferramenta.
  14. 14. Suporte a linguagens de programação ● Praticamente todas as linguagens de programação possuem suporte (driver) para MongoDB; ● Suporte oficial às principais linguagens (Python, C, C++, PHP, Java, NodeJS, Perl, Scala, Ruby, C#); ● Suporte da comunidade a diversas outras linguagens (R, Go, Erlang, LISP, Lua, Matlab, Smalltalk, entre outras)
  15. 15. Recursos animais! ● Busca textual (Full Text Search); ● Aggregation framework; ● Índices espaciais (geográficos); ● Sharding; ● Replica Set;
  16. 16. Busca textual ● Possui suporte a português do Brasil; ● Stemming; ● Stopwords;
  17. 17. Stemming ● Se a frase abaixo estiver indexada como FTS: “Enquanto houver vontade de lutar, haverá esperança de vencer” ● Se houver uma busca pela palavra “vencendo”, a mesma será exibida no resultado de busca.
  18. 18. Interface em JavaScript ● O MongoShell é baseado em JavaScript, oferece toda flexibilidade para gerenciar o banco de dados e executar operações administrativas
  19. 19. Nomenclaturas Banco Relacional MongoDB Base de dados --> Base de Dados Tabela --> Coleção Registro --> Documento Índice --> Índice Join --> Documento embarcado Foreign key --> Referência
  20. 20. Modelo de documento {'nome':'Christiano', 'sobrenome':'Anderson', 'email':'chris@christiano.me', 'twitter':'@dump', 'blog':'http://christiano.me', 'idade': 35, 'palestrante': true}
  21. 21. Realizando operações via MongoShell ● O MongoDB é implícito, não existe necessidade de criar toda estrutura do banco de dados antes; ● O MongoShell é uma ótima forma de aprendizado!
  22. 22. MongoShell anderson@endor:~$ mongo MongoDB shell version: 2.4.6 connecting to: test > a = 10 10 > b = 30 30 > a < b true > b < a false
  23. 23. Vamos lá... anderson@endor:~$ mongo MongoDB shell version: 2.4.6 connecting to: test > use escola switched to db escola > Nesse ponto, o banco ainda está vazio.
  24. 24. Inserindo um registro anderson@endor:~$ mongo MongoDB shell version: 2.4.6 connecting to: test > use escola switched to db escola > db.alunos.insert({ ... 'nome':'Rolando Rocha', ... 'turma':'Python', ... 'nota': 10}) > Nesse ponto, o banco foi criado e o documento foi inserido, já está persistido em disco
  25. 25. Verificando o registro > db.alunos.findOne() { "_id" : ObjectId("525ecd6585512f4130afd2c4"), "nome" : "Rolando Rocha", "turma" : "Python", "nota" : 10 } ObjectId é único para cada documento
  26. 26. Inserindo outro registro > db.alunos.insert({ ... nome: 'Carolina', ... sobrenome: 'Ferreira', ... sexo: 'feminino', ... idade: 29, ... email: 'carol@yahoo.com', ... materias: ['MongoDB','Riak','Java'], ... notas: {'MongoDB': 10, 'Riak': 8, 'Java': 9} ... }) >
  27. 27. Listando apenas o registro da Carolina > db.alunos.find({'nome':'Carolina'}).pretty() { "_id" : ObjectId("522f25248434c181910716ec"), "nome" : "Carolina", "sobrenome" : "Ferreira", "sexo" : "feminino", "idade" : 29, "email" : "carol@yahoo.com", "materias" : [ "MongoDB", "Riak", "Java" ], "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 } } >
  28. 28. Só mais um registro... > db.alunos.insert({ ... nome: 'Juliana', ... sobrenome: 'Silva', ... sexo: 'feminino', ... idade: 21, ... materias: ['Riak','Python'] ... }) > db.alunos.count() 3
  29. 29. Listando apenas quem é do sexo feminino > db.alunos.find({sexo:'feminino'}) { "_id" : ObjectId("5230ee7ec3141857756a81a8"), "nome" : "Carolina", "sobrenome" : "Ferreira", "sexo" : "feminino", "idade" : 29, "email" : "carol@yahoo.com", "materias" : [ "MongoDB", "Riak", "Java" ], "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 } } { "_id" : ObjectId("5230eec6c3141857756a81a9"), "nome" : "Juliana", "sobrenome" : "Silva", "sexo" : "feminino", "idade" : 21, "materias" : [ "Riak", "Python" ] }
  30. 30. Listando apenas quem tem MongoDB na matéria > db.alunos.find({materias:'MongoDB'}) { "_id" : ObjectId("522f25248434c181910716ec"), "nome" : "Carolina", "sobrenome" : "Ferreira", "sexo" : "feminino", "idade" : 29, "email" : "carol@yahoo.com", "materias" : [ "MongoDB", "Riak", "Java" ], "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 } } >
  31. 31. Listando quem tem menos de 30 anos > db.alunos.find({idade: {$lt: 30} }) { "_id" : ObjectId("522f25248434c181910716ec"), "nome" : "Carolina", "sobrenome" : "Ferreira", "sexo" : "feminino", "idade" : 29, "email" : "carol@yahoo.com", "materias" : [ "MongoDB", "Riak", "Java" ], "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 } } { "_id" : ObjectId("522f264c8434c181910716ed"), "nome" : "Juliana", "sobrenome" : "Silva", "sexo" : "feminino", "idade" : 21, "materias" : [ "Riak", "Python" ] } >
  32. 32. Alguns operadores de consulta Operador Descrição $gt Maior que $gte Maior ou igual que $lt Menor que $lte Menor ou igual que
  33. 33. Atualização de registro Padrão de pesquisa > db.alunos.update({'nome':'Carolina'}, {$set: {'sobrenome':'Ferreira Martins'}}) Operador de alteração
  34. 34. Resultado > db.alunos.find({'nome':'Carolina'}).pretty() { "_id" : ObjectId("522f2b998434c181910716ee"), "email" : "carol@yahoo.com", "idade" : 29, "materias" : [ "MongoDB", "Riak", "Java" ], "nome" : "Carolina", "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 }, "sexo" : "feminino", "sobrenome" : "Ferreira Martins" } >
  35. 35. O que acontece se fizer isso? > db.alunos.update({'nome':'Carolina'}, {'sobrenome':'Ferreira Martins'})
  36. 36. Removendo registros db.alunos.remove({'sobrenome':'Ferreira Martins'})
  37. 37. Listando só o nome dos alunos > db.alunos.find({},{'nome':true, '_id': false}) { "nome" : "Rolando" } { "nome" : "Juliana" } { "nome" : "Carolina" }
  38. 38. Ordenação > db.alunos.find({}, {'nome': true, '_id': false}).sort({nome: 1}) { "nome" : "Carolina" } { "nome" : "Juliana" } { "nome" : "Rolando" }
  39. 39. Comparativo SQL SQL MongoDB INSERT INTO USERS VALUES(1,1) db.users.insert({a:1, b:1}) SELECT a,b FROM users db.users.find({}, {a: 1, b: 1}) SELECT * FROM users db.users.find() SELECT * FROM users WHERE age=33 db.users.find({age: 33}) SELECT * FROm users WHERE name = “pedro” db.users.find({name:”pedro”})
  40. 40. Comparativo SQL SQL MongoDB SELECT * FROM users WHERE age=33 ORDER BY name db.users.find({‘age’:33}).sort({na me:1}) SELECT * FROM users WHERE age < 33 db.users.find({‘age’:{$lt:33}})}) CREATE INDEX myindexname ON user(name) db.users.ensureIndex({name:1}) SELECT * FROM users WHERE a = 1 AND b = ‘q’ db.users.find({a:1, b:’q’}) SELECT * FROM users LIMIT 10 SKIP 20 db.users.find().limit(10).skip(20)
  41. 41. Como descobrir documentos que não possuem determinada chave > db.alunos.find({'email': {$exists: false} })
  42. 42. Adicionando chave em todos os documentos Query > db.alunos.update({ }, { $set: { 'aprovado': true } }, { multi: true }) O que adicionar Grava a alteração em todos Os registros que atendem Ao critério
  43. 43. Criando apontamentos (relacionamentos) > db.alunos.find().pretty() { "_id" : "rolando", "nome" : "Rolando", "email" : "rolando@teste.com" } { "_id" : "carol", "nome" : "Carol", "email" : "carol@teste.com" } { "_id" : "july", "nome" : "Juliana", "email" : "july@teste.com" } > db.biblioteca.find().pretty() { "_id" : "0001", "titulo" : "Aprenda MongoDB" } { "_id" : "0002", "titulo" : "Aprenda Python" } { "_id" : "0003", "titulo" : "Aprenda Shell" }
  44. 44. Primeiro cenário > db.alunos.update({'_id':'rolando'},{$set:{'biblioteca_id': ['0001','0002']}}) > db.alunos.find({'_id':'rolando'}).pretty() { "_id" : "rolando", "biblioteca_id" : [ "0001", "0002" ], "email" : "rolando@teste.com", "nome" : "Rolando" }
  45. 45. Explicação primeiro cenário ● Adicionado à coleção de ALUNOS uma chave chamada biblioteca_id; ● Facilita a pesquisa de quais alunos alugaram livros (dentro da coleção alunos); ● Dificulta a pesquisa de quais livros foram alugados (dentro da coleção da biblioteca);
  46. 46. Segundo cenário > db.biblioteca.update({'_id':'0001'}, {$set:{'aluguel': {'aluno_id':'rolando','data':'2013-09-09'}}}) > db.biblioteca.find({'_id':'0001'}).pretty() { "_id" : "0001", "aluguel" : { "aluno_id" : "rolando", "data" : "2013-09-09" }, "titulo" : "Aprenda MongoDB" }
  47. 47. Explicação segundo cenário ● Adicionada uma chave “aluguel” dentro da coleção biblioteca; ● Todos livros alugados possuem o atributo “aluguel”; ● Facilita a busca dos livros disponíveis e alugados; ● Pode criar histórico de alugueis; ● Mas dificulta a busca de quais alunos estão alugando livro (visão: coleção de alunos); ● Esse seria um cenário recomendado!
  48. 48. Terceiro cenário ● Criar uma collection de referência, exemplo: “aluguel_livros” e relacionar o _id do aluno com _id do livro, assim como qualquer outra informação adicional NÃO USE ESSE MODELO! É MUITO RELACIONAL!
  49. 49. Aplicação de blog no MongoDB, casamento perfeito!!!
  50. 50. { "_id" : ObjectId("541f6a9092a2ee25fedaa655"), "titulo" : "Aqui é o título", "tags" : [ "teste", "exemplo", "mongodb" ], "conteudo" : "Aqui vem o Lorem Ipsum básico", "comentarios" : [ { "usuario" : "Usuario Troll", "email" : "troll@troland.com", "comentario" : "Vim aqui só trollar" }, { "usuario" : "Usuario Sério", "email" : "serio@serioland.com", "comentario" : "Parabéns pelo post" } ] } Exemplo Aplicação Blog Os comentários ficam embarcados no mesmo documento que o post
  51. 51. Guardar logs, séries temporais e muitos documentos pequenos, também tem uma modelagem específica para isso. Pense nas possibilidades de uso desses dados antes de gravar qualquer coisa! Faça testes, muitos testes
  52. 52. Série temporal timestamp memoria_usada 2013-10-10T23:06:37.000Z 1000000 2013-10-10T23:06:38.000Z 2000000 2013-10-10T23:06:39.000Z 2332200
  53. 53. A principal pergunta: Como você vai buscar esses dados? Vai agregar por horas, dia, mês?
  54. 54. Documentos únicos { timestamp: ISODate("2013-10-10T23:06:37.000Z"), type: ”memory_used”, value: 1000000 }, { timestamp: ISODate("2013-10-10T23:06:38.000Z"), type: ”memory_used”, value: 2000000 }, { timestamp: ISODate("2013-10-10T23:06:39.000Z"), type: ”memory_used”, value: 2322000 }
  55. 55. Documentos únicos ● Um dia possui 86.400 segundos; ● 86.400 documentos por dia na coleção; ● Se quiser pegar o histórico de um dia, terá de varrer 86.400 documentos; ● Se quiser pegar o histórico de um ano, serão 31.556.926 documentos consultados!!! ● Isso para o MongoDB é pouco, mas pode ser otimizado...
  56. 56. Agregado por minuto { timestamp_minute: ISODate("2013-10- 10T23:06:00.000Z"), type: “memory_used”, values: { 0: 999999, … 37: 1000000, 38: 1500000, … 59: 2000000 } } 23:06 Todos os segundos das 23:06
  57. 57. Documentos agregados por minuto ● Um dia possui 1.440 minutos; ● 1.440 documentos por dia na coleção; ● Se quiser pegar o histórico de um dia, terá de varrer 1.440 documentos; ● Se quiser pegar o histórico de um ano, serão 525.600 documentos consultados!!! ● Ainda pode ser mais otimizado...
  58. 58. Agregado por hora { timestamp_hour: ISODate("2013-10- 10T23:00:00.000Z"), type: “memory_used”, values: { 0: 999999, 1: 1000000, …, 3598: 1500000, 3599: 2000000 } } 23h Cada segundo dessa hora e seus respectivos valores 1h = 3.600 segundos
  59. 59. Documentos agregados por hora ● Um dia possui 24 horas; ● 24 documentos por dia na coleção; ● Se quiser pegar o histórico de um dia, terá de varrer apenas 24 documentos; ● Se quiser pegar o histórico de um ano, serão apenas 365 documentos consultados!!! ● Chegamos em um nível interessante de granularidade de dados...
  60. 60. Melhor schema A pergunta de ouro: Como buscar o maior número de informações com menor número de queries (de preferência, uma)?
  61. 61. Melhor schema ● Eficiência na gravação ● Eficiência na leitura ● Não existe mágica, é necessário entender o funcionamento da aplicação ● Bom schema, bom código = sucesso garantido ● Índices e agregadores podem ser necessários. ● Pesquise mais sobre Schema Design MongoDB;
  62. 62. Conclusão ● É um novo paradigma, evite pensar de forma relacional, senão o projeto ficará engessado; ● Pode parecer estranho no começo, mas a prática mostra que esse modelo funciona muito bem e é muito produtivo;
  63. 63. Perguntas??? Obrigado!!! Se não deu tempo de responder sua pergunta, me chame nas redes sociais ou pelos corredores do FGSL! :-) http://christiano.me Twitter: @dump Email: chris@christiano.me Facebook, LinkedIn: Christiano Anderson

×