SlideShare uma empresa Scribd logo
1 de 63
Baixar para ler offline
e NoSQL
Tudo o que você precisa saber
Fórum Internacional de Software Livre 2015
Christiano Anderson
anderson@propus.com.br
http://www.propus.com.br
Twitter: @dump
Quem sou?
●
Arquiteto de dados na Propus Science;
●
Trabalho com web e software livre desde
1995;
●
Python desde 2000;
●
MongoDB desde o início 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
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 produto
semelhante ao Google App Engine;
Alta curva de crescimento
Contribuições ao core do MongoDB
Grandes players utilizando
●
Foursquare;
●
Github;
●
EA Games;
●
Entre diversos outros
– No Brasil:
●
EasyTaxi;
●
Globo.com;
●
IG;
●
Mercado Livre
●
ZAP Imóveis
●
Ingresse.com
●
Terra Networks
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
Por que usar NoSQL?
●
Novos paradigmas (nem tão novos
assim);
●
Funcionalidades;
●
Escalabilidade;
●
Performance;
●
Não ficar preso a modelagem;
Volume de dados
●
Grande volume é relativo, o que você
considera grande?
– Dados que crescem exponencialmente;
– Agregam muitos valores dinamicamente;
– Não precisam de modelagem;
Considere uso de MongoDB se...
●
Está usando muito cache em sua aplicação;
●
Os dados mudam muito;
●
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;
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;
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;
Não existe a melhor ferramenta...
… Existe a que atende melhor a sua necessidade.
A necessidade pode exigir mais de uma ferramenta.
Suporte a linguagens de
programação
●
Praticamente todas as linguagens de programação 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)
Recursos animais!
●
Busca textual (Full Text Search);
●
Aggregation framework;
●
Índices espaciais (geográficos);
●
Sharding;
●
Replica Set;
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”
●
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 operações
administrativas
Nomenclaturas
Banco Relacional MongoDB
Base de dados --> Base de Dados
Tabela --> Coleção
Registro --> Documento
Índice --> Índice
Join --> Documento embarcado
Foreign key --> Referência
Modelo de documento
{'nome':'Christiano',
'sobrenome':'Anderson',
'email':'chris@christiano.me',
'twitter':'@dump',
'blog':'http://christiano.me',
'idade': 36,
'palestrante': true}
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!
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
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.
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
Verificando o registro
> db.alunos.findOne()
{
"_id" :
ObjectId("525ecd6585512f4130afd2c4")
,
"nome" : "Rolando Rocha",
"turma" : "Python",
"nota" : 10
}
ObjectId é único
para cada
documento
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}
... })
>
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
}
}
>
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" :
"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" ] }
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 } }
>
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" ] }
>
Alguns operadores de consulta
Operador Descrição
$gt Maior que
$gte Maior ou igual que
$lt Menor que
$lte Menor ou igual que
Atualização de registro
> db.alunos.update({'nome':'Carolina'},
{$set: {'sobrenome':'Ferreira
Martins'}})
Padrão de pesquisa
Operador de alteração
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"
}
>
O que acontece se fizer isso?
> db.alunos.update({'nome':'Carolina'},
{'sobrenome':'Ferreira Martins'})
Removendo registros
db.alunos.remove({'sobrenome':'Ferreir
a Martins'})
Listando só o nome dos alunos
> db.alunos.find({},
{'nome':true, '_id': false})
{ "nome" : "Rolando" }
{ "nome" : "Juliana" }
{ "nome" : "Carolina" }
Ordenação
> db.alunos.find({}, {'nome': true,
'_id': false}).sort({nome: 1})
{ "nome" : "Carolina" }
{ "nome" : "Juliana" }
{ "nome" : "Rolando" }
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”})
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)
Como descobrir documentos que
não 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 adicionar
Query
Grava a alteração em todos
Os registros que atendem
Ao critério
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" }
Primeiro cenário
> 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"
}
Explicação primeiro cenário
●
Adicionado à coleção de ALUNOS uma
chave chamada biblioteca_id;
●
Facilita a pesquisa de quais alunos
alugaram livros (dentro da coleção
alunos);
●
Dificulta a pesquisa de quais livros foram
alugados (dentro da coleção da
biblioteca);
Segundo cenário
> 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"
}
Explicação segundo cenário
●
Adicionada uma chave “aluguel” dentro da coleção
biblioteca;
●
Todos livros alugados possuem o atributo “aluguel”;
●
Facilita a busca dos livros disponíveis e alugados;
●
Pode criar histórico de alugueis;
●
Mas dificulta a busca de quais alunos estão alugando livro
(visão: coleção de alunos);
●
Esse seria um cenário recomendado!
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
NÃO USE ESSE MODELO!
É MUITO RELACIONAL!
Aplicação de blog no MongoDB,
casamento perfeito!!!
{
"_id" : ObjectId("541f6a9092a2ee25fedaa655"),
"titulo" : "Aqui é o título",
"tags" : [
"teste",
"exemplo",
"mongodb"
],
"conteudo" : "Aqui vem o Lorem Ipsum básico",
"comentarios" : [
{
"usuario" : "Usuario Troll",
"email" : "troll@troland.com",
"comentario" : "Vim aqui só trollar"
},
{
"usuario" : "Usuario Sério",
"email" : "serio@serioland.com",
"comentario" : "Parabéns pelo post"
}
]
}
Exemplo Aplicação Blog
Os comentários ficam
embarcados no
mesmo documento
que o post
Guardar logs, séries temporais e muitos
documentos pequenos, também tem uma
modelagem específica para isso.
Pense nas possibilidades de uso desses dados
antes de gravar qualquer coisa!
Faça testes, muitos testes
Série 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
A principal pergunta:
Como você vai buscar esses dados?
Vai agregar por horas, dia, mês?
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
}
Documentos únicos
●
Um dia possui 86.400 segundos;
●
86.400 documentos por dia na coleção;
●
Se quiser pegar o histórico de um dia, terá de
varrer 86.400 documentos;
●
Se quiser pegar o histórico de um ano, serão
31.556.926 documentos consultados!!!
●
Isso para o MongoDB é pouco, mas pode ser
otimizado...
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
Documentos agregados por minuto
●
Um dia possui 1.440 minutos;
●
1.440 documentos por dia na coleção;
●
Se quiser pegar o histórico de um dia, terá de
varrer 1.440 documentos;
●
Se quiser pegar o histórico de um ano, serão
525.600 documentos consultados!!!
●
Ainda pode ser mais otimizado...
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
Documentos agregados por hora
●
Um dia possui 24 horas;
●
24 documentos por dia na coleção;
●
Se quiser pegar o histórico de um dia, terá de
varrer apenas 24 documentos;
●
Se quiser pegar o histórico de um ano, serão
apenas 365 documentos consultados!!!
●
Chegamos em um nível interessante de
granularidade de dados...
Melhor schema
A pergunta de ouro:
Como buscar o maior número de
informações com menor número de
queries (de preferência, uma)?
Melhor schema
●
Eficiência na gravação
●
Eficiência na leitura
●
Não existe mágica, é necessário entender o
funcionamento da aplicação
●
Bom schema, bom código = sucesso garantido
●
Índices e agregadores podem ser necessários.
●
Pesquise mais sobre Schema Design MongoDB;
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;
Perguntas???
Obrigado!!! Se não 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

Mais conteúdo relacionado

Mais procurados

Kicking ass with redis
Kicking ass with redisKicking ass with redis
Kicking ass with redisDvir Volk
 
Myths of Big Partitions (Robert Stupp, DataStax) | Cassandra Summit 2016
Myths of Big Partitions (Robert Stupp, DataStax) | Cassandra Summit 2016Myths of Big Partitions (Robert Stupp, DataStax) | Cassandra Summit 2016
Myths of Big Partitions (Robert Stupp, DataStax) | Cassandra Summit 2016DataStax
 
MongoDB Sharding
MongoDB ShardingMongoDB Sharding
MongoDB ShardingRob Walters
 
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.NAVER D2
 
MySQL Parallel Replication by Booking.com
MySQL Parallel Replication by Booking.comMySQL Parallel Replication by Booking.com
MySQL Parallel Replication by Booking.comJean-François Gagné
 
Introducción a NoSQL con MongoDB
Introducción a NoSQL con MongoDBIntroducción a NoSQL con MongoDB
Introducción a NoSQL con MongoDBScalia
 
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PGPgDay.Seoul
 
Jvm tuning for low latency application & Cassandra
Jvm tuning for low latency application & CassandraJvm tuning for low latency application & Cassandra
Jvm tuning for low latency application & CassandraQuentin Ambard
 
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)MongoDB
 
Optimizing RocksDB for Open-Channel SSDs
Optimizing RocksDB for Open-Channel SSDsOptimizing RocksDB for Open-Channel SSDs
Optimizing RocksDB for Open-Channel SSDsJavier González
 
Aerospike Architecture
Aerospike ArchitectureAerospike Architecture
Aerospike ArchitecturePeter Milne
 
Outrageous Performance: RageDB's Experience with the Seastar Framework
Outrageous Performance: RageDB's Experience with the Seastar FrameworkOutrageous Performance: RageDB's Experience with the Seastar Framework
Outrageous Performance: RageDB's Experience with the Seastar FrameworkScyllaDB
 
MongoDB WiredTiger Internals: Journey To Transactions
MongoDB WiredTiger Internals: Journey To TransactionsMongoDB WiredTiger Internals: Journey To Transactions
MongoDB WiredTiger Internals: Journey To TransactionsMydbops
 
A Brief Introduction of TiDB (Percona Live)
A Brief Introduction of TiDB (Percona Live)A Brief Introduction of TiDB (Percona Live)
A Brief Introduction of TiDB (Percona Live)PingCAP
 
The InnoDB Storage Engine for MySQL
The InnoDB Storage Engine for MySQLThe InnoDB Storage Engine for MySQL
The InnoDB Storage Engine for MySQLMorgan Tocker
 
REDIS intro and how to use redis
REDIS intro and how to use redisREDIS intro and how to use redis
REDIS intro and how to use redisKris Jeong
 
[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)NAVER D2
 
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB
 

Mais procurados (20)

Kicking ass with redis
Kicking ass with redisKicking ass with redis
Kicking ass with redis
 
Myths of Big Partitions (Robert Stupp, DataStax) | Cassandra Summit 2016
Myths of Big Partitions (Robert Stupp, DataStax) | Cassandra Summit 2016Myths of Big Partitions (Robert Stupp, DataStax) | Cassandra Summit 2016
Myths of Big Partitions (Robert Stupp, DataStax) | Cassandra Summit 2016
 
MongoDB Sharding
MongoDB ShardingMongoDB Sharding
MongoDB Sharding
 
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
 
MySQL Parallel Replication by Booking.com
MySQL Parallel Replication by Booking.comMySQL Parallel Replication by Booking.com
MySQL Parallel Replication by Booking.com
 
Introducción a NoSQL con MongoDB
Introducción a NoSQL con MongoDBIntroducción a NoSQL con MongoDB
Introducción a NoSQL con MongoDB
 
Indexing
IndexingIndexing
Indexing
 
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
 
Jvm tuning for low latency application & Cassandra
Jvm tuning for low latency application & CassandraJvm tuning for low latency application & Cassandra
Jvm tuning for low latency application & Cassandra
 
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
 
Optimizing RocksDB for Open-Channel SSDs
Optimizing RocksDB for Open-Channel SSDsOptimizing RocksDB for Open-Channel SSDs
Optimizing RocksDB for Open-Channel SSDs
 
Aerospike Architecture
Aerospike ArchitectureAerospike Architecture
Aerospike Architecture
 
Outrageous Performance: RageDB's Experience with the Seastar Framework
Outrageous Performance: RageDB's Experience with the Seastar FrameworkOutrageous Performance: RageDB's Experience with the Seastar Framework
Outrageous Performance: RageDB's Experience with the Seastar Framework
 
MongoDB WiredTiger Internals: Journey To Transactions
MongoDB WiredTiger Internals: Journey To TransactionsMongoDB WiredTiger Internals: Journey To Transactions
MongoDB WiredTiger Internals: Journey To Transactions
 
A Brief Introduction of TiDB (Percona Live)
A Brief Introduction of TiDB (Percona Live)A Brief Introduction of TiDB (Percona Live)
A Brief Introduction of TiDB (Percona Live)
 
The InnoDB Storage Engine for MySQL
The InnoDB Storage Engine for MySQLThe InnoDB Storage Engine for MySQL
The InnoDB Storage Engine for MySQL
 
MongoDB
MongoDBMongoDB
MongoDB
 
REDIS intro and how to use redis
REDIS intro and how to use redisREDIS intro and how to use redis
REDIS intro and how to use redis
 
[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)
 
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
 

Destaque

Mapeando a Terra com soluções livres e GeoDjango
Mapeando a Terra com soluções livres e GeoDjangoMapeando a Terra com soluções livres e GeoDjango
Mapeando a Terra com soluções livres e GeoDjangoChristiano Anderson
 
MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014Christiano Anderson
 
Persistência Poliglota, Big Data e NoSQL FISL 15
Persistência Poliglota, Big Data e NoSQL FISL 15Persistência Poliglota, Big Data e NoSQL FISL 15
Persistência Poliglota, Big Data e NoSQL FISL 15Christiano Anderson
 
Modelos NoSQL e a Persistência Poliglota
Modelos NoSQL e a Persistência PoliglotaModelos NoSQL e a Persistência Poliglota
Modelos NoSQL e a Persistência PoliglotaGlaucio Scheibel
 
Minerando dados com Python
Minerando dados com PythonMinerando dados com Python
Minerando dados com PythonRamiro Luz
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - ApresentaçãoTerra / Neo
 
MongoDB: introdução à sua próxima base de dados
MongoDB:  introdução à sua próxima base de dadosMongoDB:  introdução à sua próxima base de dados
MongoDB: introdução à sua próxima base de dadosJordan Kobellarz
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesUtilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesChristiano Anderson
 
Minicurso Epoca mongoDB
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDBLelyBarros
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDBBrunno Gomes
 
No sql e as vantagens na utilização do mongodb
No sql e as vantagens na utilização do mongodbNo sql e as vantagens na utilização do mongodb
No sql e as vantagens na utilização do mongodbfabio perrella
 
Comparação de desempenho entre SQL e NoSQL
Comparação de desempenho entre SQL e NoSQLComparação de desempenho entre SQL e NoSQL
Comparação de desempenho entre SQL e NoSQLpichiliani
 
Desmistificando NoSQL e Novas Tecnologias de Bancos de Dados
Desmistificando NoSQL e Novas Tecnologias de Bancos de DadosDesmistificando NoSQL e Novas Tecnologias de Bancos de Dados
Desmistificando NoSQL e Novas Tecnologias de Bancos de DadosFabíola Fernandes
 

Destaque (20)

Mapeando a Terra com soluções livres e GeoDjango
Mapeando a Terra com soluções livres e GeoDjangoMapeando a Terra com soluções livres e GeoDjango
Mapeando a Terra com soluções livres e GeoDjango
 
MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014MongoDB - Tudo que você precisa saber - FGSL 2014
MongoDB - Tudo que você precisa saber - FGSL 2014
 
Persistência Poliglota, Big Data e NoSQL FISL 15
Persistência Poliglota, Big Data e NoSQL FISL 15Persistência Poliglota, Big Data e NoSQL FISL 15
Persistência Poliglota, Big Data e NoSQL FISL 15
 
Modelos NoSQL e a Persistência Poliglota
Modelos NoSQL e a Persistência PoliglotaModelos NoSQL e a Persistência Poliglota
Modelos NoSQL e a Persistência Poliglota
 
certificadoTDC2016Floripa
certificadoTDC2016FloripacertificadoTDC2016Floripa
certificadoTDC2016Floripa
 
Minerando dados com Python
Minerando dados com PythonMinerando dados com Python
Minerando dados com Python
 
MongoDB - Iniciando e Conhecendo
MongoDB - Iniciando e ConhecendoMongoDB - Iniciando e Conhecendo
MongoDB - Iniciando e Conhecendo
 
Workshop MongoDB
Workshop MongoDBWorkshop MongoDB
Workshop MongoDB
 
NoSQL e MongoDB - ETEC
NoSQL e MongoDB - ETECNoSQL e MongoDB - ETEC
NoSQL e MongoDB - ETEC
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - Apresentação
 
MongoDB: introdução à sua próxima base de dados
MongoDB:  introdução à sua próxima base de dadosMongoDB:  introdução à sua próxima base de dados
MongoDB: introdução à sua próxima base de dados
 
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentesUtilizando NoSQL no desenvolvimento de soluções inteligentes
Utilizando NoSQL no desenvolvimento de soluções inteligentes
 
Palestra MongoDB
Palestra MongoDBPalestra MongoDB
Palestra MongoDB
 
NoSQL e MongoDB
NoSQL e MongoDBNoSQL e MongoDB
NoSQL e MongoDB
 
Minicurso Epoca mongoDB
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDB
 
Mini-Curso de MongoDB
Mini-Curso de MongoDBMini-Curso de MongoDB
Mini-Curso de MongoDB
 
Introdução ao NoSql
Introdução ao NoSqlIntrodução ao NoSql
Introdução ao NoSql
 
No sql e as vantagens na utilização do mongodb
No sql e as vantagens na utilização do mongodbNo sql e as vantagens na utilização do mongodb
No sql e as vantagens na utilização do mongodb
 
Comparação de desempenho entre SQL e NoSQL
Comparação de desempenho entre SQL e NoSQLComparação de desempenho entre SQL e NoSQL
Comparação de desempenho entre SQL e NoSQL
 
Desmistificando NoSQL e Novas Tecnologias de Bancos de Dados
Desmistificando NoSQL e Novas Tecnologias de Bancos de DadosDesmistificando NoSQL e Novas Tecnologias de Bancos de Dados
Desmistificando NoSQL e Novas Tecnologias de Bancos de Dados
 

Semelhante a MongoDB NoSQL tudo

MongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberMongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberChristiano Anderson
 
MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014Christiano Anderson
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Christiano Anderson
 
Minicurso Introdução ao mongoDB SCTI
Minicurso Introdução ao mongoDB SCTIMinicurso Introdução ao mongoDB SCTI
Minicurso Introdução ao mongoDB SCTIBruna Pereira
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBDesenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBiMasters
 
GraphQL - APIs mais robustas e flexíveis
GraphQL - APIs mais robustas e flexíveisGraphQL - APIs mais robustas e flexíveis
GraphQL - APIs mais robustas e flexíveisBruno Lemos
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBAri Stopassola Junior
 
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...tdc-globalcode
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopDiego Sana
 
MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoMongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoJulio Monteiro
 
Desenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniterDesenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniterPedro Junior
 

Semelhante a MongoDB NoSQL tudo (20)

MongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saberMongoDB - Tudo o que você precisa saber
MongoDB - Tudo o que você precisa saber
 
MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014MongoDB Schema Design - Latinoware 2014
MongoDB Schema Design - Latinoware 2014
 
Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7Django e MongoDB - Python Brasil 7
Django e MongoDB - Python Brasil 7
 
Meetup MUG-RS KingHost
Meetup MUG-RS KingHostMeetup MUG-RS KingHost
Meetup MUG-RS KingHost
 
Python e MongoDB - Ensol
Python e MongoDB - EnsolPython e MongoDB - Ensol
Python e MongoDB - Ensol
 
Minicurso Introdução ao mongoDB SCTI
Minicurso Introdução ao mongoDB SCTIMinicurso Introdução ao mongoDB SCTI
Minicurso Introdução ao mongoDB SCTI
 
Python MongoDB no MongoSP
Python MongoDB no MongoSPPython MongoDB no MongoSP
Python MongoDB no MongoSP
 
MongoDB na Campus Party
MongoDB na Campus PartyMongoDB na Campus Party
MongoDB na Campus Party
 
Desenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDBDesenvolvendo soluções com banco de dados não relacional - MongoDB
Desenvolvendo soluções com banco de dados não relacional - MongoDB
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Palestra nosql
Palestra nosqlPalestra nosql
Palestra nosql
 
GraphQL - APIs mais robustas e flexíveis
GraphQL - APIs mais robustas e flexíveisGraphQL - APIs mais robustas e flexíveis
GraphQL - APIs mais robustas e flexíveis
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
 
SAAS - Search as a Service 2017
SAAS - Search as a Service 2017SAAS - Search as a Service 2017
SAAS - Search as a Service 2017
 
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
 
Minicurso mongo db
Minicurso mongo dbMinicurso mongo db
Minicurso mongo db
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day Workshop
 
Mongo + php
Mongo + phpMongo + php
Mongo + php
 
MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoMongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documento
 
Desenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniterDesenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniter
 

Mais de Christiano Anderson

Mais de Christiano Anderson (8)

Grafos - Uma abordagem divertida - Latinoware 2014
Grafos - Uma abordagem divertida - Latinoware 2014Grafos - Uma abordagem divertida - Latinoware 2014
Grafos - Uma abordagem divertida - Latinoware 2014
 
Big Data Latinoware 2014
Big Data Latinoware 2014Big Data Latinoware 2014
Big Data Latinoware 2014
 
Big Data - Conceitos Básicos
Big Data - Conceitos BásicosBig Data - Conceitos Básicos
Big Data - Conceitos Básicos
 
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERIGeo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
Geo Django - Fórum Goiano de Software Livre - 10 FGSL e 1 ERI
 
Django - Muito além do básico
Django - Muito além do básicoDjango - Muito além do básico
Django - Muito além do básico
 
GeoDjango
GeoDjangoGeoDjango
GeoDjango
 
Scrum
ScrumScrum
Scrum
 
Python and MongoDB
Python and MongoDBPython and MongoDB
Python and MongoDB
 

MongoDB NoSQL tudo

  • 1. e NoSQL Tudo o que você precisa saber Fórum 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 início 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. 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;
  • 5. Alta curva de crescimento Contribuições ao core do MongoDB
  • 6. Grandes players utilizando ● Foursquare; ● Github; ● EA Games; ● Entre diversos outros – No Brasil: ● EasyTaxi; ● Globo.com; ● IG; ● Mercado Livre ● ZAP Imóveis ● Ingresse.com ● Terra Networks
  • 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. Por que usar NoSQL? ● Novos paradigmas (nem tão novos assim); ● Funcionalidades; ● Escalabilidade; ● Performance; ● Não ficar preso a modelagem;
  • 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. Considere uso de MongoDB se... ● Está usando muito cache em sua aplicação; ● Os dados mudam muito; ● 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. 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. 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. Não 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 programação ● Praticamente todas as linguagens de programação 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 (geográficos); ● Sharding; ● Replica Set;
  • 16. Busca textual ● Possui suporte a português do Brasil; ● Stemming; ● Stopwords;
  • 17. 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.
  • 18. Interface em JavaScript ● O MongoShell é baseado em JavaScript, oferece toda flexibilidade para gerenciar o banco de dados e executar operações administrativas
  • 19. Nomenclaturas Banco Relacional MongoDB Base de dados --> Base de Dados Tabela --> Coleção Registro --> Documento Índice --> Índice Join --> Documento embarcado Foreign key --> Referência
  • 21. 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!
  • 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" ] }
  • 30. 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 } } >
  • 31. 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" ] } >
  • 32. Alguns operadores de consulta Operador Descrição $gt Maior que $gte Maior ou igual que $lt Menor que $lte Menor ou igual que
  • 33. Atualização de registro > db.alunos.update({'nome':'Carolina'}, {$set: {'sobrenome':'Ferreira Martins'}}) Padrão de pesquisa Operador de alteração
  • 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'})
  • 37. Listando só o nome dos alunos > db.alunos.find({}, {'nome':true, '_id': false}) { "nome" : "Rolando" } { "nome" : "Juliana" } { "nome" : "Carolina" }
  • 38. Ordenação > 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 não 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 alteração em todos Os registros que atendem Ao critério
  • 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 cenário > 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. Explicação primeiro cenário ● Adicionado à coleção de ALUNOS uma chave chamada biblioteca_id; ● Facilita a pesquisa de quais alunos alugaram livros (dentro da coleção alunos); ● Dificulta a pesquisa de quais livros foram alugados (dentro da coleção da biblioteca);
  • 46. Segundo cenário > 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. Explicação segundo cenário ● Adicionada uma chave “aluguel” dentro da coleção biblioteca; ● Todos livros alugados possuem o atributo “aluguel”; ● Facilita a busca dos livros disponíveis e alugados; ● Pode criar histórico de alugueis; ● Mas dificulta a busca de quais alunos estão alugando livro (visão: coleção de alunos); ● Esse seria um cenário recomendado!
  • 48. 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 NÃO USE ESSE MODELO! É MUITO RELACIONAL!
  • 49. Aplicação de blog no MongoDB, casamento perfeito!!!
  • 50. { "_id" : ObjectId("541f6a9092a2ee25fedaa655"), "titulo" : "Aqui é o título", "tags" : [ "teste", "exemplo", "mongodb" ], "conteudo" : "Aqui vem o Lorem Ipsum básico", "comentarios" : [ { "usuario" : "Usuario Troll", "email" : "troll@troland.com", "comentario" : "Vim aqui só trollar" }, { "usuario" : "Usuario Sério", "email" : "serio@serioland.com", "comentario" : "Parabéns pelo post" } ] } Exemplo Aplicação Blog Os comentários ficam embarcados no mesmo documento que o post
  • 51. Guardar logs, séries temporais e muitos documentos pequenos, também tem uma modelagem específica para isso. Pense nas possibilidades de uso desses dados antes de gravar qualquer coisa! Faça testes, muitos testes
  • 52. Série 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, mês?
  • 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 coleção; ● Se quiser pegar o histórico de um dia, terá de varrer 86.400 documentos; ● Se quiser pegar o histórico de um ano, serão 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 coleção; ● Se quiser pegar o histórico de um dia, terá de varrer 1.440 documentos; ● Se quiser pegar o histórico de um ano, serão 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 coleção; ● Se quiser pegar o histórico de um dia, terá de varrer apenas 24 documentos; ● Se quiser pegar o histórico de um ano, serão apenas 365 documentos consultados!!! ● Chegamos em um nível interessante de granularidade de dados...
  • 60. Melhor schema A pergunta de ouro: Como buscar o maior número de informações com menor número de queries (de preferência, uma)?
  • 61. Melhor schema ● Eficiência na gravação ● Eficiência na leitura ● Não existe mágica, é necessário entender o funcionamento da aplicação ● Bom schema, bom código = sucesso garantido ● Índices e agregadores podem ser necessários. ● Pesquise mais sobre Schema Design MongoDB;
  • 62. 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;
  • 63. Perguntas??? Obrigado!!! Se não 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