MongoDB - Tudo o que você precisa saber - FISL16
Preview:
Citation preview
- 1. e NoSQL Tudo o que voc precisa saber Frum Internacional de
Software Livre 2015 Christiano Anderson anderson@propus.com.br
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':'chris@christiano.me',
'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: 'carol@yahoo.com', ... 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" : "carol@yahoo.com", "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" : "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" ] }
- 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" :
"carol@yahoo.com", "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" : "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. 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" :
"rolando@teste.com", "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" : "troll@troland.com",
"comentario" : "Vim aqui s trollar" }, { "usuario" : "Usuario
Srio", "email" : "serio@serioland.com", "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: chris@christiano.me
Facebook, LinkedIn: Christiano Anderson