mongodb - tudo o que você precisa saber - fisl16

Download MongoDB - Tudo o que você precisa saber - FISL16

If you can't read please download the document

Upload: christiano-anderson

Post on 16-Aug-2015

107 views

Category:

Data & Analytics


6 download

TRANSCRIPT

  1. 1. e NoSQL Tudo o que voc precisa saber Frum Internacional de Software Livre 2015 Christiano Anderson [email protected] http://www.propus.com.br Twitter: @dump
  2. 2. Quem sou? Arquiteto de dados na Propus Science; Trabalho com web e software livre desde 1995; Python desde 2000; MongoDB desde o incio 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. Histria 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 Contribuies 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 Imveis Ingresse.com Terra Networks
  7. 7. Um pouco de conceitos... NoSQL: O termo foi criado por Carlo Strozzi e Eric Evans como referncia a um tipo de armazenamento de dados; Nunca, mas nunca est relacionado a dio ao modelo SQL, pelo contrrio, podem at trabalhar em conjunto; O termo NoREL e No Relacional tambm bastante utilizado
  8. 8. Por que usar NoSQL? Novos paradigmas (nem to novos assim); Funcionalidades; Escalabilidade; Performance; No 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; No precisam de modelagem;
  10. 10. Considere uso de MongoDB se... Est usando muito cache em sua aplicao; Os dados mudam muito; Os dados esto crescendo de forma exponencial; Precisa de processamento em tempo real; Gosta de desenvolvimento gil; Sua aplicao beta perptua; Tem dificuldade para trabalhar com modelo relacional; Usa muito join na sua aplicao relacional;
  11. 11. Iniciando com MongoDB Sua distribuio GNU/Linux deve possuir pacotes prontos; No site da MongoDB, possvel baixar binrios para outros sistemas operacionais; A instalao bem simples, a configurao padro do MongoDB j atende quase todos os cenrios;
  12. 12. Pode substituir o banco relacional? At pode, mas uma questo de arquitetura e escolhas; Uma aplicao pode usar MongoDB e banco relacional; Tudo vai depender da sua arquitetura;
  13. 13. No 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 programao Praticamente todas as linguagens de programao 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 (geogrficos); Sharding; Replica Set;
  16. 16. Busca textual Possui suporte a portugus do Brasil; Stemming; Stopwords;
  17. 17. Stemming Se a frase abaixo estiver indexada como FTS: Enquanto houver vontade de lutar, haver esperana 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 operaes administrativas
  19. 19. Nomenclaturas Banco Relacional MongoDB Base de dados --> Base de Dados Tabela --> Coleo Registro --> Documento ndice --> ndice Join --> Documento embarcado Foreign key --> Referncia
  20. 20. Modelo de documento {'nome':'Christiano', 'sobrenome':'Anderson', 'email':'[email protected]', 'twitter':'@dump', 'blog':'http://christiano.me', 'idade': 36, 'palestrante': true}
  21. 21. Realizando operaes via MongoShell O MongoDB implcito, no 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: '[email protected]', ... 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" : "[email protected]", "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" : "[email protected]", "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. 32. Alguns operadores de consulta Operador Descrio $gt Maior que $gte Maior ou igual que $lt Menor que $lte Menor ou igual que
  31. 33. Atualizao de registro > db.alunos.update({'nome':'Carolina'}, {$set: {'sobrenome':'Ferreira Martins'}}) Padro de pesquisa Operador de alterao
  32. 34. Resultado> db.alunos.find({'nome':'Carolina'}).pretty() { "_id" : ObjectId("522f2b998434c181910716ee"), "email" : "[email protected]", "idade" : 29, "materias" : [ "MongoDB", "Riak", "Java" ], "nome" : "Carolina", "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 }, "sexo" : "feminino", "sobrenome" : "Ferreira Martins" } >
  33. 35. O que acontece se fizer isso? > db.alunos.update({'nome':'Carolina'}, {'sobrenome':'Ferreira Martins'})
  34. 36. Removendo registros db.alunos.remove({'sobrenome':'Ferreir a Martins'})
  35. 37. Listando s o nome dos alunos > db.alunos.find({}, {'nome':true, '_id': false}) { "nome" : "Rolando" } { "nome" : "Juliana" } { "nome" : "Carolina" }
  36. 38. Ordenao > db.alunos.find({}, {'nome': true, '_id': false}).sort({nome: 1}) { "nome" : "Carolina" } { "nome" : "Juliana" } { "nome" : "Rolando" }
  37. 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})
  38. 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)
  39. 41. Como descobrir documentos que no possuem determinada chave > db.alunos.find({'email': {$exists: false} })
  40. 42. Adicionando chave em todos os documentos > db.alunos.update({ }, { $set: { 'aprovado': true } }, { multi: true }) O que adicionar Query Grava a alterao em todos Os registros que atendem Ao critrio
  41. 43. Criando apontamentos (relacionamentos) > db.alunos.find().pretty() { "_id" : "rolando", "nome" : "Rolando", "email" : "[email protected]" } { "_id" : "carol", "nome" : "Carol", "email" : "[email protected]" } { "_id" : "july", "nome" : "Juliana", "email" : "[email protected]" } > db.biblioteca.find().pretty() { "_id" : "0001", "titulo" : "Aprenda MongoDB" } { "_id" : "0002", "titulo" : "Aprenda Python" } { "_id" : "0003", "titulo" : "Aprenda Shell" }
  42. 44. Primeiro cenrio > db.alunos.update({'_id':'rolando'},{$set: {'biblioteca_id':['0001','0002']}}) > db.alunos.find({'_id':'rolando'}).pretty() { "_id" : "rolando", "biblioteca_id" : [ "0001", "0002" ], "email" : "[email protected]", "nome" : "Rolando" }
  43. 45. Explicao primeiro cenrio Adicionado coleo de ALUNOS uma chave chamada biblioteca_id; Facilita a pesquisa de quais alunos alugaram livros (dentro da coleo alunos); Dificulta a pesquisa de quais livros foram alugados (dentro da coleo da biblioteca);
  44. 46. Segundo cenrio > 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" }
  45. 47. Explicao segundo cenrio Adicionada uma chave aluguel dentro da coleo biblioteca; Todos livros alugados possuem o atributo aluguel; Facilita a busca dos livros disponveis e alugados; Pode criar histrico de alugueis; Mas dificulta a busca de quais alunos esto alugando livro (viso: coleo de alunos); Esse seria um cenrio recomendado!
  46. 48. Terceiro cenrio Criar uma collection de referncia, exemplo: aluguel_livros e relacionar o _id do aluno com _id do livro, assim como qualquer outra informao adicional NO USE ESSE MODELO! MUITO RELACIONAL!
  47. 49. Aplicao de blog no MongoDB, casamento perfeito!!!
  48. 50. { "_id" : ObjectId("541f6a9092a2ee25fedaa655"), "titulo" : "Aqui o ttulo", "tags" : [ "teste", "exemplo", "mongodb" ], "conteudo" : "Aqui vem o Lorem Ipsum bsico", "comentarios" : [ { "usuario" : "Usuario Troll", "email" : "[email protected]", "comentario" : "Vim aqui s trollar" }, { "usuario" : "Usuario Srio", "email" : "[email protected]", "comentario" : "Parabns pelo post" } ] } Exemplo Aplicao Blog Os comentrios ficam embarcados no mesmo documento que o post
  49. 51. Guardar logs, sries temporais e muitos documentos pequenos, tambm tem uma modelagem especfica para isso. Pense nas possibilidades de uso desses dados antes de gravar qualquer coisa! Faa testes, muitos testes
  50. 52. Srie 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
  51. 53. A principal pergunta: Como voc vai buscar esses dados? Vai agregar por horas, dia, ms?
  52. 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 }
  53. 55. Documentos nicos Um dia possui 86.400 segundos; 86.400 documentos por dia na coleo; Se quiser pegar o histrico de um dia, ter de varrer 86.400 documentos; Se quiser pegar o histrico de um ano, sero 31.556.926 documentos consultados!!! Isso para o MongoDB pouco, mas pode ser otimizado...
  54. 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
  55. 57. Documentos agregados por minuto Um dia possui 1.440 minutos; 1.440 documentos por dia na coleo; Se quiser pegar o histrico de um dia, ter de varrer 1.440 documentos; Se quiser pegar o histrico de um ano, sero 525.600 documentos consultados!!! Ainda pode ser mais otimizado...
  56. 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 } } Cada segundo dessa hora e seus respectivos valores 1h = 3.600 segundos 23h
  57. 59. Documentos agregados por hora Um dia possui 24 horas; 24 documentos por dia na coleo; Se quiser pegar o histrico de um dia, ter de varrer apenas 24 documentos; Se quiser pegar o histrico de um ano, sero apenas 365 documentos consultados!!! Chegamos em um nvel interessante de granularidade de dados...
  58. 60. Melhor schema A pergunta de ouro: Como buscar o maior nmero de informaes com menor nmero de queries (de preferncia, uma)?
  59. 61. Melhor schema Eficincia na gravao Eficincia na leitura No existe mgica, necessrio entender o funcionamento da aplicao Bom schema, bom cdigo = sucesso garantido ndices e agregadores podem ser necessrios. Pesquise mais sobre Schema Design MongoDB;
  60. 62. Concluso um novo paradigma, evite pensar de forma relacional, seno o projeto ficar engessado; Pode parecer estranho no comeo, mas a prtica mostra que esse modelo funciona muito bem e muito produtivo;
  61. 63. Perguntas??? Obrigado!!! Se no deu tempo de responder sua pergunta, me chame nas redes sociais ou pelos corredores do FISL! :-) http://christiano.me Twitter: @dump Email: [email protected] Facebook, LinkedIn: Christiano Anderson