mongodb - tudo o que você precisa saber
TRANSCRIPT
MongoDB - Tudo o que voc precisa saber
Tudo o que voc precisa saber
Christiano [email protected]://christiano.meTwitter: @dump
Mongo?
Sim, em muitos idiomas pode ser um termo pejorativo, mas a origem vem de:
Humongous
Gigantesco
Histria
Foi criado pelos fundadores da Doubleclick;
10gen foi fundada em 2007;
A ideia inicial era fazer um produto semelhante ao Google App Engine;
Alta curva de crescimento
Contribuies ao core do MongoDB
Inmeras contribuies
Em pouco tempo, muitos projetos novos:MongoEngine;
Mongoose;
Pymongo;
MongoKit;
MongoMapper .
Grandes players utilizando
Foursquare;
Github;
EA Games;
Entre diversos outrosNo Brasil:EasyTaxi;
Globo.com;
IG;
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
Por que usar NoSQL?
Novos paradigmas (nem to novos assim);
Funcionalidades;
Escalabilidade;
Performance;
No ficar preso a modelagem;
Volume de dados
Grande volume relativo, o que voc considera grande?Dados que crescem exponencialmente;
Agregam muitos valores dinamicamente;
No precisam de modelagem;
Considere uso de MongoDB se...
Est usando muito cache em sua aplicao;
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;
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;
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;
Suporte a linguagens de programao
Praticamente todas as linguagens de programao possuem suporte (driver) para MongoDB;
A lgica bem parecida, o MongoDB tenta manter o mximo de padro;
Recursos animais!
Busca textual (Full Text Search);
Aggregation framework;
ndices espaciais (geogrficos);
Sharding;
Replica Set;
Busca textual
Possui suporte a portugus do Brasil;
Stemming;
Stopwords;
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.
Interface em JavaScript
O MongoShell baseado em JavaScript, oferece toda flexibilidade para gerenciar o banco de dados e executar operaes administrativas
Nomenclaturas
Banco RelacionalMongoDB
Base de dados-->Base de Dados
Tabela-->Coleo
Registro-->Documento
ndice-->ndice
Join-->Documento embarcado
Foreign key-->Referncia
Modelo de documento
{'nome':'Christiano','sobrenome':'Anderson','email':'[email protected]','nota': 10}
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!
MongoShell
anderson@endor:~$ mongoMongoDB shell version: 2.4.6connecting to: test> a = 1010> b = 3030> a < btrue> b < afalse
Vamos l...
anderson@endor:~$ mongoMongoDB shell version: 2.4.6connecting to: test> use latinowareswitched to db latinoware>
Nesse ponto, o bancoainda est vazio.
Inserindo um registro
anderson@endor:~$ mongoMongoDB shell version: 2.4.6connecting to: test> use latinowareswitched to db latinoware> db.alunos.insert({... 'nome':'Pedro',... 'turma':'Python',... 'nota': 10})>
Nesse ponto, o banco foi criadoe o documento foi inserido, jest persistido em disco
Verificando o registro
> db.alunos.findOne(){"_id" : ObjectId("525ecd6585512f4130afd2c4"),"nome" : "Pedro","turma" : "Python","nota" : 10}
ObjectId nico para cada documento
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}... })>
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 }}>
S mais um registro...
> db.alunos.insert({... nome: 'Juliana',... sobrenome: 'Silva',... sexo: 'feminino',... idade: 21,... materias: ['Riak','Python']... })
> db.alunos.count()3
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" ] }
Listando apenas quem tem MongoDB na matria
> db.alunos.find({materias:'MongoDB'})
{ "_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 } }>
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" : "[email protected]", "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" ] }>
Alguns operadores de consulta
OperadorDescrio
$gtMaior que
$gteMaior ou igual que
$ltMenor que
$lteMenor ou igual que
Atualizao de registro
> db.alunos.update({'nome':'Carolina'}, {$set: {'sobrenome':'Ferreira Martins'}})
Padro de pesquisa
Operador de alterao
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"}>
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" : "Pedro" }{ "nome" : "Juliana" }{ "nome" : "Carolina" }
Ordenao
> db.alunos.find({}, {'nome': true, '_id': false}).sort({nome: 1})
{ "nome" : "Carolina" }{ "nome" : "Juliana" }{ "nome" : "Pedro" }
Comparativo SQL
SQLMongoDB
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=33db.users.find({age: 33})
SELECT * FROm users WHERE name = pedro
db.users.find({name:pedro})
Comparativo SQL
SQLMongoDB
SELECT * FROM users WHERE age=33 ORDER BY name
db.users.find({age:33}).sort({name:1})
SELECT * FROM users WHERE age < 33db.users.find({age:{$lt:33}})})
CREATE INDEX myindexname ON user(name)db.users.ensureIndex({name:1})
SELECT * FROM users WHERE a = 1 AND b = qdb.users.find({a:1, b:q})
SELECT * FROM users LIMIT 10 SKIP 20db.users.find().limit(10).skip(20)
Como descobrir documentos que no possuem determinada chave
> db.alunos.find({'email': {$exists: false} })
Adicionando chave em todos os documentos
> db.alunos.update({ }, { $set: { 'aprovado': true } }, { multi: true })
O que adicionarQuery
Grava a alterao em todosOs registros que atendemAo critrio
Criando apontamentos (relacionamentos)
> db.alunos.find().pretty(){ "_id" : "pedro", "nome" : "Pedro", "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" }
Primeiro cenrio
> db.alunos.update({'_id':'pedro'},{$set:{'biblioteca_id':['0001','0002']}})
> db.alunos.find({'_id':'pedro'}).pretty(){"_id" : "pedro","biblioteca_id" : ["0001","0002"],"email" : "[email protected]","nome" : "Pedro"}
Segundo cenrio
> db.biblioteca.update({'_id':'0001'},{$set:{'aluguel':{'aluno_id':'pedro','data':'2013-09-09'}}})
> db.biblioteca.find({'_id':'0001'}).pretty(){"_id" : "0001","aluguel" : {"aluno_id" : "pedro","data" : "2013-09-09"},"titulo" : "Aprenda MongoDB"}
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
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;
Perguntas!
Obrigado!!! Se no deu tempo de responder sua pergunta, me chame nas redes sociais ou pelos corredores da Latinoware! :-)
http://christiano.meTwitter: @dumpEmail: [email protected]