0
Tudo o que você precisa saber

Christiano Anderson
christiano@christiano.me
http://christiano.me
Twitter: @dump
Mongo?
●

Sim, em muitos idiomas pode ser um termo
pejorativo, mas a origem vem de:

Humongous
“Gigantesco”
História
●

Foi criado pelos fundadores da Doubleclick;

●

10gen foi fundada em 2007;

●

A ideia inicial era fazer um pr...
Alta curva de crescimento

Contribuições ao core do MongoDB
Inúmeras contribuições
●

Em pouco tempo, muitos projetos novos:
–

MongoEngine;

–

Mongoose;

–

Pymongo;

–

MongoKit;
...
Grandes players utilizando
●

Foursquare;

●

Github;

●

EA Games;

●

Entre diversos outros
–

No Brasil:
●
●
●

EasyTax...
Um pouco de conceitos...
●

●

●

NoSQL: O termo foi criado por Carlo Strozzi e Eric
Evans como referência a um tipo de ar...
Por que usar NoSQL?
●

Novos paradigmas (nem tão novos assim);

●

Funcionalidades;

●

Escalabilidade;

●

Performance;

...
Volume de dados
●

Grande volume é relativo, o que você considera
grande?
–

Dados que crescem exponencialmente;

–

Agreg...
Considere uso de MongoDB se...
●

Está usando muito cache em sua aplicação;

●

Os dados estão crescendo de forma exponenc...
Iniciando com MongoDB
●

●

●

Sua distribuição GNU/Linux deve possuir pacotes
prontos;
No site da MongoDB, possível baixa...
Pode substituir o banco relacional?
●

●

●

Até pode, mas é uma questão de arquitetura e
escolhas;
Uma aplicação pode usa...
Suporte a linguagens de programação
●

●

Praticamente todas as linguagens de programação
possuem suporte (driver) para Mo...
Recursos animais!
●

Busca textual (Full Text Search);

●

Aggregation framework;

●

Índices espaciais (geográficos);

●
...
Busca textual
●

Possui suporte a português do Brasil;

●

Stemming;

●

Stopwords;
Stemming
●

Se a frase abaixo estiver indexada como FTS:
“Enquanto houver vontade de lutar, haverá
esperança de vencer”

●...
Interface em JavaScript
●

O MongoShell é baseado em JavaScript, oferece
toda flexibilidade para gerenciar o banco de dado...
Nomenclaturas
Banco Relacional

MongoDB

Base de dados

-->

Base de Dados

Tabela

-->

Coleção

Registro

-->

Documento...
Modelo de documento
{'nome':'Christiano',
'sobrenome':'Anderson',
'email':'anderson@nodeware.com.br',
'nota': 10}
Realizando operações via MongoShell
●

●

O MongoDB é implícito, não existe necessidade de
criar toda estrutura do banco d...
MongoShell
anderson@endor:~$ mongo
MongoDB shell version: 2.4.6
connecting to: test
> a = 10
10
> b = 30
30
>a<b
true
>b<a...
Vamos lá...
anderson@endor:~$ mongo
MongoDB shell version: 2.4.6
connecting to: test
> use latinoware
switched to db latin...
Inserindo um registro
anderson@endor:~$ mongo
MongoDB shell version: 2.4.6
connecting to: test
> use latinoware
switched t...
Verificando o registro
ObjectId é único para
cada documento

> db.alunos.findOne()
{
"_id" : ObjectId("525ecd6585512f4130a...
Inserindo outro registro
> db.alunos.insert({
... nome: 'Carolina',
... sobrenome: 'Ferreira',
... sexo: 'feminino',
... i...
Listando apenas o registro da Carolina
> db.alunos.find({'nome':'Carolina'}).pretty()
{
"_id" : ObjectId("522f25248434c181...
Só mais um registro...
> db.alunos.insert({
... nome: 'Juliana',
... sobrenome: 'Silva',
... sexo: 'feminino',
... idade: ...
Listando apenas quem é do sexo
feminino
> db.alunos.find({sexo:'feminino'})
{ "_id" : ObjectId("5230ee7ec3141857756a81a8")...
Listando apenas quem tem MongoDB
na matéria
> db.alunos.find({materias:'MongoDB'})
{ "_id" : ObjectId("522f25248434c181910...
Listando quem tem menos de 30 anos
>

db.alunos.find({idade: {$lt: 30} })

{ "_id" : ObjectId("522f25248434c181910716ec"),...
Alguns operadores de consulta
Operador

$gt
$gte
$lt
$lte

Descrição

Maior que

Maior ou igual que

Menor que

Menor ou i...
Atualização de registro
Padrão de pesquisa

> db.alunos.update({'nome':'Carolina'},
{$set: {'sobrenome':'Ferreira Martins'...
Resultado
> db.alunos.find({'nome':'Carolina'}).pretty()
{
"_id" : ObjectId("522f2b998434c181910716ee"),
"email" : "carol@...
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,
{ "nome" : "Pedro" }
{ "nome" : "Juliana" }
{ "nome" : "Ca...
Ordenação
> db.alunos.find({}, {'nome': true, '_id': false}).sort({nome: 1})
{ "nome" : "Carolina" }
{ "nome" : "Juliana" ...
Comparativo SQL
SQL

MongoDB

INSERT INTO USERS VALUES(1,1)

db.users.insert({a:1, b:1})

SELECT a,b FROM users

db.users....
Comparativo SQL
SQL
SELECT * FROM users WHERE age=33
ORDER BY name

MongoDB
db.users.find({‘age’:33}).sort({na
me:1})

SEL...
Como descobrir documentos que não
possuem determinada chave
> db.alunos.find({'email': {$exists: false} })
Adicionando chave em todos os
documentos
Query

> db.alunos.update({ },
O que adicionar

{ $set: { 'aprovado': true } },
{...
Criando apontamentos
(relacionamentos)
> db.alunos.find().pretty()
{ "_id" : "pedro", "nome" : "Pedro", "email" : "pedro@t...
Primeiro cenário
> db.alunos.update({'_id':'pedro'},{$set:{'biblioteca_id':
['0001','0002']}})
> db.alunos.find({'_id':'pe...
Segundo cenário
> db.biblioteca.update({'_id':'0001'},
{$set:{'aluguel':
{'aluno_id':'pedro','data':'2013-09-09'}}})
> db....
Terceiro cenário
●

Criar uma collection de referência, exemplo:
“aluguel_livros” e relacionar o _id do aluno com _id
do l...
Conclusão
●

●

É um novo paradigma, evite pensar de forma
relacional, senão o projeto ficará engessado;
Pode parecer estr...
Perguntas!
●

Obrigado!!! Se não deu tempo de responder sua
pergunta, me chame nas redes sociais ou pelos
corredores da La...
Upcoming SlideShare
Loading in...5
×

MongoDB - Tudo o que você precisa saber

5,680

Published on

Apresentação na Latinoware 2013

Published in: Technology
0 Comments
23 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,680
On Slideshare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
176
Comments
0
Likes
23
Embeds 0
No embeds

No notes for slide
  • {}
  • Transcript of "MongoDB - Tudo o que você precisa saber"

    1. 1. Tudo o que você precisa saber Christiano Anderson christiano@christiano.me http://christiano.me Twitter: @dump
    2. 2. Mongo? ● Sim, em muitos idiomas pode ser um termo pejorativo, mas a origem vem de: Humongous “Gigantesco”
    3. 3. História ● Foi criado pelos fundadores da Doubleclick; ● 10gen foi fundada em 2007; ● A ideia inicial era fazer um produto semelhante ao Google App Engine;
    4. 4. Alta curva de crescimento Contribuições ao core do MongoDB
    5. 5. Inúmeras contribuições ● Em pouco tempo, muitos projetos novos: – MongoEngine; – Mongoose; – Pymongo; – MongoKit; – MongoMapper ….
    6. 6. Grandes players utilizando ● Foursquare; ● Github; ● EA Games; ● Entre diversos outros – No Brasil: ● ● ● EasyTaxi; Globo.com; IG;
    7. 7. Um pouco de conceitos... ● ● ● NoSQL: O termo foi criado por Carlo Strozzi e Eric Evans como referência a um tipo de armazenamento de dados; Nunca, mas nunca está relacionado a ódio ao modelo SQL, pelo contrário, podem até trabalhar em conjunto; O termo NoREL e Não Relacional também é bastante utilizado
    8. 8. Por que usar NoSQL? ● Novos paradigmas (nem tão novos assim); ● Funcionalidades; ● Escalabilidade; ● Performance; ● Não 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; – Não precisam de modelagem;
    10. 10. Considere uso de MongoDB se... ● Está usando muito cache em sua aplicação; ● Os dados estão crescendo de forma exponencial; ● Precisa de processamento em tempo real; ● Gosta de desenvolvimento ágil; ● Sua aplicação é “beta perpétua”; ● Tem dificuldade para trabalhar com modelo relacional; ● Usa muito “join” na sua aplicação relacional;
    11. 11. Iniciando com MongoDB ● ● ● Sua distribuição GNU/Linux deve possuir pacotes prontos; No site da MongoDB, possível baixar binários para outros sistemas operacionais; A instalação é bem simples, a configuração padrão do MongoDB já atende quase todos os cenários;
    12. 12. Pode substituir o banco relacional? ● ● ● Até pode, mas é uma questão de arquitetura e escolhas; Uma aplicação pode usar MongoDB e banco relacional; Tudo vai depender da sua arquitetura;
    13. 13. Suporte a linguagens de programação ● ● Praticamente todas as linguagens de programação possuem suporte (driver) para MongoDB; A lógica é bem parecida, o MongoDB tenta manter o máximo de padrão;
    14. 14. Recursos animais! ● Busca textual (Full Text Search); ● Aggregation framework; ● Índices espaciais (geográficos); ● Sharding; ● Replica Set;
    15. 15. Busca textual ● Possui suporte a português do Brasil; ● Stemming; ● Stopwords;
    16. 16. Stemming ● Se a frase abaixo estiver indexada como FTS: “Enquanto houver vontade de lutar, haverá esperança de vencer” ● Se houver uma busca pela palavra “vencendo”, a mesma será exibida no resultado de busca.
    17. 17. Interface em JavaScript ● O MongoShell é baseado em JavaScript, oferece toda flexibilidade para gerenciar o banco de dados e executar operações administrativas
    18. 18. Nomenclaturas Banco Relacional MongoDB Base de dados --> Base de Dados Tabela --> Coleção Registro --> Documento Índice --> Índice Join --> Documento embarcado Foreign key --> Referência
    19. 19. Modelo de documento {'nome':'Christiano', 'sobrenome':'Anderson', 'email':'anderson@nodeware.com.br', 'nota': 10}
    20. 20. Realizando operações via MongoShell ● ● O MongoDB é implícito, não existe necessidade de criar toda estrutura do banco de dados antes; O MongoShell é uma ótima forma de aprendizado!
    21. 21. 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
    22. 22. Vamos lá... anderson@endor:~$ mongo MongoDB shell version: 2.4.6 connecting to: test > use latinoware switched to db latinoware > Nesse ponto, o banco ainda está vazio.
    23. 23. Inserindo um registro anderson@endor:~$ mongo MongoDB shell version: 2.4.6 connecting to: test > use latinoware switched to db latinoware > db.alunos.insert({ ... 'nome':'Pedro', ... 'turma':'Python', ... 'nota': 10}) > Nesse ponto, o banco foi criado e o documento foi inserido, já está persistido em disco
    24. 24. Verificando o registro ObjectId é único para cada documento > db.alunos.findOne() { "_id" : ObjectId("525ecd6585512f4130afd2c4"), "nome" : "Pedro", "turma" : "Python", "nota" : 10 }
    25. 25. 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} ... }) >
    26. 26. 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 } } >
    27. 27. Só mais um registro... > db.alunos.insert({ ... nome: 'Juliana', ... sobrenome: 'Silva', ... sexo: 'feminino', ... idade: 21, ... materias: ['Riak','Python'] ... }) > db.alunos.count() 3
    28. 28. 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" ] }
    29. 29. Listando apenas quem tem MongoDB na matéria > db.alunos.find({materias:'MongoDB'}) { "_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 } } >
    30. 30. 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" : "carol@yahoo.com", "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" ] } >
    31. 31. Alguns operadores de consulta Operador $gt $gte $lt $lte Descrição Maior que Maior ou igual que Menor que Menor ou igual que
    32. 32. Atualização de registro Padrão de pesquisa > db.alunos.update({'nome':'Carolina'}, {$set: {'sobrenome':'Ferreira Martins'}}) Operador de alteração
    33. 33. 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" } >
    34. 34. O que acontece se fizer isso? > db.alunos.update({'nome':'Carolina'}, {'sobrenome':'Ferreira Martins'})
    35. 35. Removendo registros db.alunos.remove({'sobrenome':'Ferreira Martins'})
    36. 36. Listando só o nome dos alunos > db.alunos.find({},{'nome':true, { "nome" : "Pedro" } { "nome" : "Juliana" } { "nome" : "Carolina" } '_id': false})
    37. 37. Ordenação > db.alunos.find({}, {'nome': true, '_id': false}).sort({nome: 1}) { "nome" : "Carolina" } { "nome" : "Juliana" } { "nome" : "Pedro" }
    38. 38. 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 = db.users.find({name:”pedro”}) “pedro”
    39. 39. Comparativo SQL SQL SELECT * FROM users WHERE age=33 ORDER BY name MongoDB 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 db.users.ensureIndex({name:1}) user(name) SELECT * FROM users WHERE a = 1 AND b = ‘q’ SELECT * FROM users LIMIT 10 SKIP 20 db.users.find({a:1, b:’q’}) db.users.find().limit(10).skip(20)
    40. 40. Como descobrir documentos que não possuem determinada chave > db.alunos.find({'email': {$exists: false} })
    41. 41. Adicionando chave em todos os documentos Query > db.alunos.update({ }, O que adicionar { $set: { 'aprovado': true } }, { multi: true }) Grava a alteração em todos Os registros que atendem Ao critério
    42. 42. Criando apontamentos (relacionamentos) > db.alunos.find().pretty() { "_id" : "pedro", "nome" : "Pedro", "email" : "pedro@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" }
    43. 43. Primeiro cenário > db.alunos.update({'_id':'pedro'},{$set:{'biblioteca_id': ['0001','0002']}}) > db.alunos.find({'_id':'pedro'}).pretty() { "_id" : "pedro", "biblioteca_id" : [ "0001", "0002" ], "email" : "pedro@teste.com", "nome" : "Pedro" }
    44. 44. Segundo cenário > 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" }
    45. 45. Terceiro cenário ● Criar uma collection de referência, exemplo: “aluguel_livros” e relacionar o _id do aluno com _id do livro, assim como qualquer outra informação adicional
    46. 46. Conclusão ● ● É um novo paradigma, evite pensar de forma relacional, senão o projeto ficará engessado; Pode parecer estranho no começo, mas a prática mostra que esse modelo funciona muito bem e é muito produtivo;
    47. 47. Perguntas! ● Obrigado!!! Se não deu tempo de responder sua pergunta, me chame nas redes sociais ou pelos corredores da Latinoware! :-) http://christiano.me Twitter: @dump Email: christiano@christiano.me
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×