mongodb - tudo o que você precisa saber - fisl16
TRANSCRIPT
- 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. 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. Mongo? Sim, em muitos idiomas pode ser um termo pejorativo, mas a origem vem de: Humongous Gigantesco
- 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. Alta curva de crescimento Contribuies ao core do MongoDB
- 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. 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. Por que usar NoSQL? Novos paradigmas (nem to novos assim); Funcionalidades; Escalabilidade; Performance; No ficar preso a modelagem;
- 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. 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. 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. 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. No existe a melhor ferramenta... Existe a que atende melhor a sua necessidade. A necessidade pode exigir mais de uma ferramenta.
- 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. Recursos animais! Busca textual (Full Text Search); Aggregation framework; ndices espaciais (geogrficos); Sharding; Replica Set;
- 16. Busca textual Possui suporte a portugus do Brasil; Stemming; Stopwords;
- 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. Interface em JavaScript O MongoShell baseado em JavaScript, oferece toda flexibilidade para gerenciar o banco de dados e executar operaes administrativas
- 19. Nomenclaturas Banco Relacional MongoDB Base de dados --> Base de Dados Tabela --> Coleo Registro --> Documento ndice --> ndice Join --> Documento embarcado Foreign key --> Referncia
- 20. Modelo de documento {'nome':'Christiano', 'sobrenome':'Anderson', 'email':'[email protected]', 'twitter':'@dump', 'blog':'http://christiano.me', 'idade': 36, 'palestrante': true}
- 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. 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. 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. 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. Verificando o registro > db.alunos.findOne() { "_id" : ObjectId("525ecd6585512f4130afd2c4") , "nome" : "Rolando Rocha", "turma" : "Python", "nota" : 10 } ObjectId nico para cada documento
- 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. 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. S mais um registro... > db.alunos.insert({ ... nome: 'Juliana', ... sobrenome: 'Silva', ... sexo: 'feminino', ... idade: 21, ... materias: ['Riak','Python'] ... }) > db.alunos.count() 3
- 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" ] }
- 32. Alguns operadores de consulta Operador Descrio $gt Maior que $gte Maior ou igual que $lt Menor que $lte Menor ou igual que
- 33. Atualizao de registro > db.alunos.update({'nome':'Carolina'}, {$set: {'sobrenome':'Ferreira Martins'}}) Padro de pesquisa Operador de alterao
- 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" } >
- 35. O que acontece se fizer isso? > db.alunos.update({'nome':'Carolina'}, {'sobrenome':'Ferreira Martins'})
- 36. Removendo registros db.alunos.remove({'sobrenome':'Ferreir a Martins'})
- 37. Listando s o nome dos alunos > db.alunos.find({}, {'nome':true, '_id': false}) { "nome" : "Rolando" } { "nome" : "Juliana" } { "nome" : "Carolina" }
- 38. Ordenao > db.alunos.find({}, {'nome': true, '_id': false}).sort({nome: 1}) { "nome" : "Carolina" } { "nome" : "Juliana" } { "nome" : "Rolando" }
- 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. 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. Como descobrir documentos que no possuem determinada chave > db.alunos.find({'email': {$exists: false} })
- 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
- 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" }
- 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" }
- 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);
- 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" }
- 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!
- 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!
- 49. Aplicao de blog no MongoDB, casamento perfeito!!!
- 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
- 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
- 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
- 53. A principal pergunta: Como voc vai buscar esses dados? Vai agregar por horas, dia, ms?
- 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. 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...
- 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. 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...
- 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
- 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...
- 60. Melhor schema A pergunta de ouro: Como buscar o maior nmero de informaes com menor nmero de queries (de preferncia, uma)?
- 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;
- 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;
- 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