14. Relembrando ACID
São 4 propriedades que os BDs tradicionais fornecem
às aplicações:
Atomicity
Garante que um conjunto de modificações seja
realizado por completo ou nada é feito
Consistency
Garante que o banco não está em um estado
inconsistente
Isolation
Dados que estão durante operação são inacessíveis
Durability
Garantia de qua transação só é finalizada quando está
salva no disco
23. usando:
salvando na coleção
> db.estudantes.insert(estudante);
24. o insert() acabou de guardar o documento
estudante na coleção de estudantes,
localizada na base teste
a coleção estudantes não precisou ser
previamente criada, a partir do momento que é
usada o mongoDB cria uma coleção
a base teste é usada por padrão quando
conectamos ao mongoDB, podemos escolher
outras bases e coleções quando quisermos
25. usando:
escolhendo base e coleção
> show dbs;
> use nomedabase;
> show collections;
> db.nomedacolecao.metodo();
27. o campo _id:
todo documento inserido no banco deve
conter um campo _id com valor único em toda
coleção, caso ele não exista é
automaticamente adicionado (nesse caso
usando o tipo binário ObjectId, que servirá
como índice padrão).
29. o find() faz uma consulta e retorna todos os
documentos que correspondem ao filtro
passado ao find()
nesse caso o método find() não recebeu
nenhum parâmetro, então ele retornou todos
os documentos daquela coleção
31. o $gt é um dos operadores especiais, nesse
caso significa '>' (maior que/greater than)
existem vários outros:
$lt - '<', $lte - '<=',
$gte - '>=', $ne - '!='
$in - 'no array', $nin - '! no array'
33. o findOne() retorna o primeiro documento
encontrado que corresponda aos parâmetros
da consulta
quando você estiver utilizando o driver da sua
linguagem ele já retorna um objeto do tipo
dicionário/hash/coisaDaSuaLinguagem
35. o update() recebe como primeiro parâmetro os
filtros da consulta e como segundo a
atualização a ser feita. nesse caso foi passado
um outro documento, então ele vai
sobrescrever tudo
existem outras maneiras de se atualizar
documentos
39. o $push adiciona o valor 'p1' ao campo
'cadeiras', se 'cadeiras' é um array/lista.
caso 'cadeiras' não exista, é criado com a lista
['p1'] como valor
41. o remove() remove (é mêmo?) os documentos
que correspondam aos parâmetros de
consulta passados no método
caso seja chamado sem parâmetros, remove
todos os elementos de uma coleção
42. ok, já sei o básico, mas como
aproveitar mais o que o
mongoDB oferece?
44. Princípio da Localidade
Espacial
Também Binha!
Utilizar espaço contíguo no disco para evitar
reposicionamento da agulha no disco que é uma
operação de alta latência.
Caso a agulha seja movida, quanto menor o
deslocamento, mais rápido será a operação.
45. Estudo de Caso
História: Quero mostrar meus
posts, os seus comentários
com as informações de cada
usuário.
52. WARNING
Dados não normalizados implica na
duplicação de dados.
Se os dados da duplicação forem
críticos, devem ser atualizado nas
múltiplas ocorrências.
53. WARNING
Otimize quando possível.
Quando a duplicação for
difícil de ser tratada, normalize
seus dados
58. Quando eu devo usar
Índices?
Otimizar consultas por um campo
específico
Otimizar buscas ordenadas
Otimizar buscas dentro de intervalos
de valores
59. Chaves Embarcadas e múltiplas
db.posts.ensureIndex({'comentarios.autor':
1});
Chaves Compostas:
db.factories.insert({ 'name': "General
Motors",
'metro': { 'city': "New York",
'state': "NY" } }
);
db.factories.ensureIndex( { metro : 1 } );
60. WARNING
Não crie índices sem necessidade, ou para
consultas raras
Índices aumentam o tempo de inserção de
documentos
Atualização nos documentos com índices
demoram +
61. WARNING
Índices podem ocupar muita memória
Ao criar um índice em uma coleção não
vazia, essa operação (por
padrão) congelará o processo do mongoDB
até concluir a indexação.
Utilize:
db.things.ensureIndex(
{'x':1},{'background':true});
63. Capped Collections
O que são?
São coleções sem índices, sem _id e
com tamanhos fixos.
db.createCollection('visitas',
{'capped':true,'size':100000})
65. Capped Collections
Para que servem?
Inserção de dados otimizada
Rápido para consultas do tipo: as últimas
Consultas genéricas são lentas
MapReduce mais rápido (mais adiante)
Ex.: Logs, Coleta massiva de dados
66. Profiling
Existem N maneiras de fazer uma
consulta, Certo?
Mas qual é a mais eficiente?
Na dúvida utilize Profiling:
db.posts.find().explain()
67. Profiling
{
'cursor' : "BasicCursor",
--> Tipo de Cursor da consulta
'nscanned' : 1,
--> Índices visitados
'nscannedObjects' : 1,
--> Objetos visitados
'n' : 14,
--> Quantidade de objetos retornados
'millis' : 1,
--> Tempo de execução da consulta
"indexBounds" : {}
--> Range dos índices que foram
varridos
}
68. GridFS
É uma Coleção de Arquivos
Documentos > 4MB
Armazenar dados binários
ex.: Vídeos, Mapas, ...
Esquema chave/valor
Disponível através do driver de alguma
linguagem.
69. Sharding & Replica
Escalabilidade horizontal
Fácil adição de shards
Sem pontos únicos de ruptura
Balanceamento de carga automático
Processamento distribuído
(MapReduce)
71. MapReduce
É um modelo de programação criado pelo
Google para processar quantidades
massivas de dados,
na escala de Terabytes.
Esse modelo permite um escalabilidade
horizontal em um cluster de
computadores.
Paper: http://labs.google.com/papers/mapreduce.html
72. MapReduce
Problemas
Consulta em bases gigantes
Recuperação de informação
Engenhos de Busca (Yahoo!)
Mineração de Dados
Análise de Logs
Indicação de Amigos
74. MapReduce
1 - Map: Para cada item da entrada executa
uma função e retorna um par
<Chave1, Valor1> intermediário.
2 - Reduce: Junte os pares <Chave1,Valor1>
com chaves iguais emitidas pela função
anterior, processe e retorne um par <Chave2,
Valor2> como resultado final.
75. MapReduce
1 - Χάρτης: Για κάθε σημείο της εισόδου εκτελεί
μια λειτουργία και επιστρέφει ένα ζεύγος
<Βασικά1, αξία1> μεσάζοντα.
2 - Μείωση: Συμμετοχή στο <Βασικά1,αξία1>
ζευγάρια με ίσα κλειδιά που εκδίδονται από την
προηγούμενη λειτουργία, διαδικασία και να
επιστρέψει ένα <Βασικά2,αξία2> ζεύγος ως το
τελικό αποτέλεσμα.
80. MapReduce
Por padrão, o mongodb cria uma coleção
temporária:
show collections
tmp.mr.mapreduce_1282610145_3
Utilizando os drivers da sua linguagem, é
possível renomear essa coleção temporária.
81. MapReduce
...OU
Criamos uma função de finalização:
finalize = function(word, tags) {
db.tagCloud.insert(
{'keyword':word,
'count': tags['count'],
tags['posts']})
}