Mongodb workshop cinlug
-
Upload
daker-fernandes -
Category
Documents
-
view
1.024 -
download
0
Transcript of Mongodb workshop cinlug
![Page 1: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/1.jpg)
http://cinlug-br.org/
![Page 2: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/2.jpg)
![Page 3: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/3.jpg)
De acordo com o mongoDB.org:
“Banco de dados escalável, de alta-performance, open-source, schema-free,
orientado-a-documentos.”
![Page 4: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/4.jpg)
documentos
![Page 5: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/5.jpg)
{nome: 'mongo', tipo: 'BD'}
![Page 6: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/6.jpg)
JSON ?
![Page 7: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/7.jpg)
JSON !
hash
dicionário
array
![Page 8: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/8.jpg)
schema-free ?
![Page 9: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/9.jpg)
tipagem dinâmicamigrations de graçaainda posso usar índices
![Page 10: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/10.jpg)
migrations ?
![Page 11: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/11.jpg)
{nome: 'mongo', tipo: 'BD'}
apenas faça:
{nome: 'mongo', tipo: 'BD', versao: 1.6}
![Page 12: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/12.jpg)
coisas que podem fazer falta
![Page 13: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/13.jpg)
As propriedades ACID ficam na mão do programador
![Page 14: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/14.jpg)
Relembrando ACIDSão 4 propriedades que os BDs tradicionais fornecem às aplicações:
AtomicityGarante que um conjunto de modificações seja realizado por completo ou nada é feito
ConsistencyGarante que o banco não está em um estado inconsistente
Isolation Dados que estão durante operação são inacessíveis
DurabilityGarantia de qua transação só é finalizada quando está salva no disco
![Page 15: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/15.jpg)
usando o mongoDB
a partir do Terminal
![Page 16: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/16.jpg)
instalando:
> http://www.mongodb.org/downloads
> escolha a versão adequada ao seu SO e arquitetura (32-bits / 64-bits) (32
> descompacte (dezipe, desenrare) > só isso mesmo...
![Page 17: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/17.jpg)
WARNINGAs versões de 32-bits do mongoDB são limitadas a uns 2.5 GB de dados
![Page 18: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/18.jpg)
Oxe, porque?Como o foco dele é em performance, ele usa um sistema de mapeamento de arquivos em memória em alguns momentos, logo...
![Page 19: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/19.jpg)
usando:
> bin/mongod <- servidor
> bin/mongo <- cliente
![Page 20: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/20.jpg)
usando:
o cliente (vulgo shell) é baseado em Javascript
então podemos fazer qualquer coisa (que faríamos com Javascript num terminal, claro)
![Page 21: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/21.jpg)
usando:> n1 = 5;
> n2 = 8; > if (n2 > n1) { menor = n1; } else { menor = n2; }
![Page 22: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/22.jpg)
usando:criando um documento
> estudante = {nome: 'brunno', nota: 6};
![Page 23: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/23.jpg)
usando:
salvando na coleção
> db.estudantes.insert(estudante);
![Page 24: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/24.jpg)
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
![Page 25: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/25.jpg)
usando:escolhendo base e coleção
> show dbs;
> use nomedabase; > show collections; > db.nomedacolecao.metodo();
![Page 26: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/26.jpg)
usando:podemos usar atalhos
> est = db.estudantes;
> est.insert({nome: 'daker', nota: 10});
![Page 27: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/27.jpg)
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).
![Page 28: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/28.jpg)
usando:
resgatando documentos
> db.estudantes.find();
![Page 29: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/29.jpg)
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
![Page 30: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/30.jpg)
usando:resgatando documentos
> est.find({nota: 7}); > est.find({nota: { '$gt': 7});
![Page 31: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/31.jpg)
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'
![Page 32: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/32.jpg)
usando:
o findOne()
> est.findOne({nota: 7});
![Page 33: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/33.jpg)
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
![Page 34: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/34.jpg)
usando:atualizando um documento
> est.update({ name: 'brunno'}, { name: 'brunno, nota: 10 });
![Page 35: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/35.jpg)
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
![Page 36: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/36.jpg)
usando:atualizando um documento
> est.update({ name: 'brunno' }, { $set: { nota: 8 } });
![Page 37: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/37.jpg)
o $set define o valor 8 no campo nota
caso 'nota' não exista, é criado com valor 8
![Page 38: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/38.jpg)
usando:atualizando um documento
> est.update({ name: 'brunno' }, { $push: { cadeira: 'p1' } });
![Page 39: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/39.jpg)
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
![Page 40: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/40.jpg)
usando:removendo documentos
> est.remove(); > est.remove({ name: 'brunno' });
![Page 41: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/41.jpg)
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
![Page 42: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/42.jpg)
ok, já sei o básico, mas como aproveitar mais o que o
mongoDB oferece?
![Page 43: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/43.jpg)
Agregue seus dados de acordo com o uso
Princípio da Localidade Espacial
![Page 44: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/44.jpg)
Também Binha!
Princípio da Localidade Espacial
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.
![Page 45: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/45.jpg)
História: Quero mostrar meus posts, os seus comentários com as informações de cada usuário.
Estudo de Caso
![Page 46: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/46.jpg)
Modelo Relacional
post = {'_id': 1, 'titulo': "lambda lambda lambda", 'texto': “Live Long and Prosper!”, 'autor_id': 34}
autor1 = {'_id': 34, 'nome': 'Spock'}
autor2 = {'_id': 33, 'nome': 'Kirk'}
comentario = {'post_id': 1, 'autor_id': 33, 'texto': 'Excelente Spock'}
![Page 47: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/47.jpg)
Como ocorre o acesso ao disco?
![Page 48: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/48.jpg)
Como ocorre o acesso ao disco?
![Page 49: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/49.jpg)
Modelo Não Normalizadopost = {'_id': 1, 'titulo': 'lambda lambda lambda', 'texto': 'era uma vez...', 'autor': {'_id': 1, 'nome': 'spock'}, 'comentarios': [ {'autor': 'kirk', 'texto': 'muito bom!'}]}
![Page 50: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/50.jpg)
E como ocorre o acesso ao disco agora?
![Page 51: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/51.jpg)
Join tables é muito custoso!
$$$
![Page 52: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/52.jpg)
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.
![Page 53: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/53.jpg)
WARNING Otimize quando possível.
Quando a duplicação for difícil de ser tratada, normalize seus dados
![Page 54: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/54.jpg)
muito + coisas legais
![Page 55: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/55.jpg)
ÍndicesCriam um atalho para a busca de dados Acesso rápido aos ítens indexados
![Page 56: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/56.jpg)
Índices
db.posts.ensureIndex({'hora': 1});
db.posts.ensureIndex({'autor':1});
![Page 57: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/57.jpg)
Índices fazem o que?
![Page 58: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/58.jpg)
Quando eu devo usar Índices?
Otimizar consultas por um campo específicoOtimizar buscas ordenadasOtimizar buscas dentro de intervalos de valores
![Page 59: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/59.jpg)
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 } );
![Page 60: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/60.jpg)
WARNINGNão crie índices sem necessidade, ou para consultas rarasÍndices aumentam o tempo de inserção de documentosAtualização nos documentos com índices demoram +
![Page 61: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/61.jpg)
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});
![Page 62: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/62.jpg)
tem +
Chaves decrescentes Chaves únicas Chaves dropáveis dropIndex reIndex Índices Geoespaciais...
![Page 63: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/63.jpg)
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})
![Page 64: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/64.jpg)
Capped Collections Operações idênticas a uma coleção comum: db.visits.insert({ 'ip':'108.23.47.98', 'timestamp': 1292177707})
db.visits.remove()
![Page 65: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/65.jpg)
Capped CollectionsPara que servem?
Inserção de dados otimizada Rápido para consultas do tipo: as últimasConsultas genéricas são lentasMapReduce mais rápido (mais adiante)
Ex.: Logs, Coleta massiva de dados
![Page 66: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/66.jpg)
Existem N maneiras de fazer uma consulta, Certo?
Mas qual é a mais eficiente? Na dúvida utilize Profiling: db.posts.find().explain()
Profiling
![Page 67: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/67.jpg)
{ '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 }
Profiling
![Page 68: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/68.jpg)
É uma Coleção de ArquivosDocumentos > 4MB Armazenar dados binários
ex.: Vídeos, Mapas, ...Esquema chave/valorDisponível através do driver de alguma linguagem.
GridFS
![Page 69: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/69.jpg)
Sharding & Replica
Escalabilidade horizontalFácil adição de shards Sem pontos únicos de rupturaBalanceamento de carga automáticoProcessamento distribuído (MapReduce)
![Page 70: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/70.jpg)
Sharding & Replica
![Page 71: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/71.jpg)
É 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.
MapReduce
Paper: http://labs.google.com/papers/mapreduce.html
![Page 72: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/72.jpg)
ProblemasConsulta em bases gigantesRecuperação de informaçãoEngenhos de Busca (Yahoo!)Mineração de DadosAnálise de LogsIndicação de Amigos
MapReduce
![Page 73: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/73.jpg)
E como funciona?
MapReduce
![Page 74: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/74.jpg)
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.
MapReduce
![Page 75: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/75.jpg)
1 - Χάρτης: Για κάθε σημείο της εισόδου εκτελεί μια λειτουργία και επιστρέφει ένα ζεύγος
<Βασικά1, αξία1> μεσάζοντα.
2 - Μείωση: Συμμετοχή στο <Βασικά1,αξία1> ζευγάρια με ίσα κλειδιά που εκδίδονται από την
προηγούμενη λειτουργία, διαδικασία και να επιστρέψει ένα <Βασικά2,αξία2> ζεύγος ως το
τελικό αποτέλεσμα.
MapReduce
![Page 76: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/76.jpg)
Na Prática:
![Page 77: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/77.jpg)
map = function() { var words = this.conteudo.split(' '); for(var i = 0; i < words.length; i++) { emit(words[i], {'count': 1,'posts':[this._id]}); }}
MapReduce
![Page 78: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/78.jpg)
reduce = function(word, tags) { var total = 0; var posts = []; for(var i = 0; i < tags.length; i++) { total += tags[i]['count']; posts = posts.concat( tags[i]['posts']); } return {'count': total, 'posts': posts}; }
MapReduce
![Page 79: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/79.jpg)
GO!
db.posts.mapReduce(map,reduce);
MapReduce
![Page 80: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/80.jpg)
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.
MapReduce
![Page 81: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/81.jpg)
...OUCriamos uma função de finalização:
finalize = function(word, tags) { db.tagCloud.insert( {'keyword':word, 'count': tags['count'], 'posts': tags['posts']})}
MapReduce
![Page 82: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/82.jpg)
db.posts.mapReduce(map,reduce, {'finalize':finalize});
MapReduce
![Page 83: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/83.jpg)
mais ?
![Page 84: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/84.jpg)
drivers para:
CC++JavaJavascriptPHPPerlPythonRubyREST C# e .NetClosure ColdFusionDelphiErlang
FactorFantomF#GoGroovyHaskellLuanode.jsObjective CPowershell ScalaSchemeSmalltalk...
![Page 85: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/85.jpg)
mais informações?
http://www.mongodb.org/display/DOCS
http://www.mongodb.org/display/DOCS/Drivers
![Page 86: Mongodb workshop cinlug](https://reader034.fdocumentos.tips/reader034/viewer/2022042505/55909dd81a28ab84148b46f7/html5/thumbnails/86.jpg)