MongoDB - Tudo o que você precisa saber

download MongoDB - Tudo o que você precisa saber

If you can't read please download the document

Transcript of MongoDB - Tudo o que você precisa saber

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]