Você está na página 1de 44

MongoDB

Carlos Eduardo Coelho Gomes


Vitor de Gamboa Viana

Top. Esp. BD II 12/9/21 1


Roteiro
 MongoDB.
 Schema Design
 Index
 Replicação
 Sharding
 Querying
 Updating
 MapReduce
 GridFS
 Aplicação.
 Conclusão.
 Bibliografia.
Top. Esp. BD II 12/9/21 2
MongoDB
 Banco de dados orientado a documentos
 O Shell do MongoDB é baseado em Javascript
 Alta performance
 Open source
 Escrito em C++
 Consultas dinâmicas
 Eficiente para armazenar dados binários,
como: fotos e vídeos
 Preparado para trabalhar com replicação
 MapReduce para agregações complexas

Top. Esp. BD II 12/9/21 3


MongoDB
 Quem utiliza?

 SourceForge
 NY Times
 Justin.tv

Top. Esp. BD II 12/9/21 4


MongoDB
 Uso do BSON

 BSON é utilizado como formato de


armazenamento de dados e transferência
através da rede para “documentos”.

Top. Esp. BD II 12/9/21 5


MongoDB - Schema Design

Top. Esp. BD II 12/9/21 7


MongoDB - Schema Design
 Embutido vs. Referenciado

 Base de dados relacionais: Cada sub-item


de interesse se torna uma tabela.

 MongoDB: Objetos embutidos é o mais


recomendado.

 Buscas à base de dados são eliminadas.

Top. Esp. BD II 12/9/21 8


MongoDB - Schema Design
 Seleção de índice

 Regra geral: Onde você deseja um índice,


em base de dados relacionais, você deseja
um índice no MongoDB.

 Campo _id é automaticamente indexado.

Top. Esp. BD II 12/9/21 9


MongoDB - Schema Design
 Quantas coleções?

 Uso de uma única coleção é possível, mas


não recomendado (performance).

 Tendência dos dados serem gravados


sequencialmente no disco.

Top. Esp. BD II 12/9/21 10


MongoDB - Index
 Básico
 db.things.ensureIndex({J : 1});
 db.things.find({J : 2});

 Default Indexes:
 _id
 Chaves embutidas
 db.things.ensureIndex({“address.city”:1})
 Documentos como chaves
 db.factories.ensureIndex ({metro : 1});
 Arrays
 Cada elemento é indexado.
Top. Esp. BD II 12/9/21 11
MongoDB - Index
 Índices compostos

 bd.things.ensureIndex({j: 1, name: -1});


 1 (ascending)
 -1 (descending)

 Se temos um índice em
 a,b,c
 Podemos usá-lo em queries de:
 a
 a,b
 a,b,c
Top. Esp. BD II 12/9/21 12
MongoDB - Index
 Unique Indexes

 db.things.ensureIndex({name:1,lastname:1}
, {unique: true});

 Missing Keys
 db.things.save({lastname: “Viana”}); OK
 db.things.save({lastname: “Assis”}); Falha

 Duplicate Values
 Db.things.ensureIndex({name:1}, {unique:true,
dropDups:true});
Top. Esp. BD II 12/9/21 13
MongoDB - Index
 Background Index Building
 Bloqueia outras operações na base.

 Dropping Index
 db.collection.dropIndexes();

 ReIndex
 db.myCollection.reIndex();
 //same as:
 db.runCommand({reIndex : ‘myCollection’})

Top. Esp. BD II 12/9/21 14


MongoDB - Replicação
 Forma de configuração mestre-escravo,
ou seja, apenas um servidor está ativo
para gravações (o mestre) em um dado
momento.
 coerência semântica forte

 Pode-se optar por executar consultas


sobre os escravos, quando
comportamento de leitura futuramente
consistente (eventually consistent) é
aceitável.

Top. Esp. BD II 12/9/21 15


MongoDB - Replicação
 Possibilidade de definir
propositalmente um delay para aplicar
as operações do mestre em um escravo

 Útil caso haja alguma falha humana

>mongod --slave --source mymaster.foo.com --slavedelay 7200

Top. Esp. BD II 12/9/21 16


 Possibilidade de bloqueio até que uma
operação de gravação seja replicada
para N servidores.
>db.runCommand ((GetLastError: 1, w: 2))

 Definir Timeout para retornar erro.


> db.runCommand({getlasterror : 1, w : 40, wtimeout : 3000})
{ "err" : null,
"n" : 0,
"wtimeout" : true,
"waited" : 3006,
"errmsg" : "timed out waiting for slaves",
"ok" : 0}

Top. Esp. BD II 12/9/21 17


 Suporte a Autenticação
É necessário ter um usuário no banco de
dados local em cada nó com mesmo usuário
e senha.

 Geralmente, é usado o usuário repl, o 1º


que será buscado por padrão.

 Usuários BD local têm permissão plena de


ler e escrever no servidor.

Top. Esp. BD II 12/9/21 18


MongoDB - Sharding
 O MongoDB inclui um módulo de sharding
automático que permite a construção de
um cluster de banco de dados escalável
horizontalmente projetado para
incorporar novas máquinas de forma
dinâmica.

Top. Esp. BD II 12/9/21 19


MongoDB - Sharding
 Nessa arquitetura, um cluster consiste
de:
 Dois ou mais blocos de servidores
chamados de “shards”
 Um ou mais servidores de configuração –
os quais armazenam os metadados do banco

 e qualquer número de processos


roteadores chamados de “mongos” através
dos quais os servidores da aplicação se
conectam

Top. Esp. BD II 12/9/21 20


MongoDB - Sharding
 O gerenciamento de falhas se dá
através da substituição automática do
servidor falho por um novo servidor.
Assim, cada “shard” sempre estará on-
line.

Top. Esp. BD II 12/9/21 21


MongoDB - Sharding

Top. Esp. BD II 12/9/21 22


MongoDB - Queriyng
 Suporta consultas dinâmicas

 Consultas expressas pelo padrão BSON

 db.users.find({});

 db.users.find({‘name’: ‘Vitor’});

Top. Esp. BD II 12/9/21 23


MongoDB – Query Options
 Field Selection
db.users.find({‘name’: ‘Vitor’}, {‘age’:1})
db.users.find({}, {‘thumbnail’: 0})

 Sorting
 ascending

db.users.find({}).sort({name: 1})

 Skip and Limit


Db.users.find({}, {}, 10, 20);

Top. Esp. BD II 12/9/21 24


MongoDB – Query Options
 SlaveOK - Replicação
 Consulta direcionada pro Master por default.
 db.getMongo().setSlaveOK(); //enable
 db.users.find(...)

 Cursores
 Find() retorna um cursor.

Top. Esp. BD II 12/9/21 25


MongoDB - Updating
 Syntax for update
 db.collection.update

(criteria,objNew,upsert, multi)

 Argumentos
 Criteria: critério de seleção.
 objNew: Objeto atualizado.
 Upsert: Se existe, atualiza, senão insere.
 Multi: Todos os elementos que satisfazem o
critério de seleção serão atualizados.

Top. Esp. BD II 12/9/21 26


MongoDB – Modifier Operations
 $inc
db.user.update({name:’Joe’}, {$inc:{n:1}})
 Ache o primeiro Joe e incremente N em 1

 $set
 {$set : {field : value}}

 $unset
 {$unset : {field : 1}}

Top. Esp. BD II 12/9/21 27


MongoDB – Modifier Operations
 $push/$pushAll
 {$push : {field : value}}
 Adiciona value ao array, se o array existir.
Senão cria o array.

 $addToset
 {$addToSet : {field : value}}
 Adiciona ao array, se ainda não está no array.

Top. Esp. BD II 12/9/21 28


MongoDB – Modifier Operations
 $pop
 {$pop : {field : 1}}
 Remove o último elemento do array

 {$pop : {field : -1}}


 Remove o primeiro elemento do array

 $pull/$pullAll
 {$pull : {field : value}}
 Remove todas as ocorrências do value em um
array.

Top. Esp. BD II 12/9/21 29


MongoDB – $ Operator
$ - Posição do item do array
>t.find()
{‘_id’:ObjectId(‘1’), ‘title’:’ABC’,
‘comments’:[{‘by’:’joe’, ‘votes’:3},
{‘by’: ‘Jane’, ‘votes’:7}]}

>t.update{(‘comments.by’:’Joe’), {$inc:
{‘comments.$.votes’:1}}, false, true}

Top. Esp. BD II 12/9/21 30


MongoDB – Map/Reduce
 Útil para manipulação de dados em lote
e operações de agregações
 Similar ao Hadoop onde todas entradas
vem de uma coleção e a saída é uma
coleção também.
 Frequentemente é usado em situação
onde teríamos usado GROUP BY no SQL

Top. Esp. BD II 12/9/21 31


MongoDB – Map/Reduce
> // map function
> m = function(){
... this.tags.forEach(
... function(z){
... emit( z , { count : 1 } );
... }
... );
...};
> // reduce function
> r = function( key , values ){
... var total = 0;
... for ( var i=0; i<values.length; i++ )
... total += values[i].count;
... return { count : total };
...};
> res = db.things.mapReduce(m,r);

Top. Esp. BD II 12/9/21 32


MongoDB – Map/Reduce
--Outro exemplo: Média de notas das matérias
mapReduce = db.alunos.mapReduce(function () {
this.materias.forEach(function (materia) {
materia.notas.forEach(function (nota) {
emit(materia.materia, nota);
})
})
}, function (key, vals) {
var somaDasNotas = 0;
vals.forEach(function (nota) {
somaDasNotas += nota;
});
var media = somaDasNotas / vals.length;
return media;
})

Top. Esp. BD II 12/9/21 33


MongoDB – GridFS
 GridFS é uma especificação de
armazenamento de objetos grandes em
MongoDB.
 Divisão do objeto grande em pedaços
pequenos (chunks), geralmente 256k de
tamanho.

Top. Esp. BD II 12/9/21 34


MongoDB – GridFS
 Cada pedaço (chunk) é armazenado como um
documento separado, em uma coleção
‘chunks’.
 Metadados sobre o arquivo são armazenados
como um documento em uma coleção ‘files’.
 Assim, para um dado arquivo armazenado
usando GridFS, existirá um documento na
coleção ‘files’ e um ou mais documentos
na coleção ‘chunks’.

Top. Esp. BD II 12/9/21 35


MongoDB – GridFS

Top. Esp. BD II 12/9/21 36


MongoDB – GridFS
 Documentos em ‘files’ requer os seguintes campos:

 Outros informações podem ser adicionadas:

Top. Esp. BD II 12/9/21 37


MongoDB – GridFS
 A estrutura de um documento na coleção ‘chunk’ é
a seguinte:

OBS.: files_id é uma chave estrangeira contendo o


campo _id de um documento da coleção ‘files’

Top. Esp. BD II 12/9/21 38


Aplicação
 Para explorar as funcionalidades do
MongoDB na prática, implementaremos um
blog:
 Postagens
 Comentários (embedded documents)
 Usuários
 Votos (MapReduce)
 Tags (MapReduce)
 Upload de Imagens e Vídeos (GridFS)

Top. Esp. BD II 12/9/21 39


Aplicação
 Usuários (collection)
 Exemplo:
 $user = array(
  'name' => 'Cesar Rodas',
  'email' => 'crodas@php.net',
  'address' => array(
 array(
 'country' => 'PY',
 'zip' => '2160',
 'address1' => 'foo bar'
 ),
   array(
 'country' => 'PY',
 'zip' => '2161',
 'address1' => 'foo bar bar foo'
 ),
  ),
  'sessions' => 0,
 );
Top. Esp. BD II 12/9/21 40
Aplicação
 Tags (MapReduce)
 Exemplo:
 $map = new MongoCode("function () {
 var i;
  
  for (i=0; i < this.tags.length; i++) {
 emit(this.tags[i], {count: 1});
   }
 }");
  
 $reduce = new MongoCode("function (key, values) {
   var i, total=0;
  
   for (i=0; i < values.length; i++) {
   total = values[i].count;
   }
   return {count: total}
 }");

Top. Esp. BD II 12/9/21 41


Aplicação
 Upload de Imagens e Vídeos
 Exemplo usando PHP:

 $metadata = array(
 <pre> "filename" => "path.avi",
 "downloads" => 0,
 "comment" => "This file is foo bar",
 "permissions" => array(
  "crodas" => "write",
  "everybody" => "read",
 )
 );
 $grid = $db->getGridFS();
 $grid->storeFile("/file/to/path.avi", $metadata);

Top. Esp. BD II 12/9/21 42


Conclusão
 Algumas funcionalidades do MongoDB
facilitam consultas FullText.

 Um documento deve ser auto-contido, ou


seja, isolado já deve conter todas as
informações de que necessita.

 Maior performance. Uma única consulta


já te retorna tudo o que você precisa
saber a respeito do documento.

Top. Esp. BD II 12/9/21 43


Bibliografia
 http://www.mongodb.org/
 http://bsonspec.org/
 http://json.org/

Top. Esp. BD II 12/9/21 44

Você também pode gostar