sexta-feira, 2 de maio de 2014

MongoDB tem suporte para a execução Queries de Map Reduce , além de ter um sql regular como interface de consulta. Na documentação, podemos ler que não é a melhor idéia usá-lo como uma interface regular, mas é muito bom para a geração de processos em background, como por exemplo a elaboração de relatórios ou o cache de alguns dados. Vou tentar mostrar exemplo simples como criar uma query Map Reduce e executá-lo.


Javascript


As Queries de Map Reduce no MongoDB são escritas em javascript. Tudo que você tem a fazer é preparar duas funções javascript








2
3
4


var map = function(){
/* emit values for each document */
emit();
}


Na função de mapa que você tem que emitir uma chave para os valores do documento, por exemplo. para cada documento geradas URLs e contados.








1
2
3
4


var reduce = function(key, value){
/* reduce emited values into result */
return {result1: one, result2: two};
}


Na função de redução simplesmente vamos reunir os resultados e resumi-los. É mais fácil pensar que reduzir é algo como dobrar ou injetar (dependendo do plano) sobre os valores da função de mapeamento emitidos.

Execução de scripts


O MongoDB tem uma interface muito legal para a execução de scripts. Vamos examinar um exemplo simples.








1


mongo localhost:27017/canis_production generate_report.js


Isto irá executar o script “generate_report.js” no banco de dados“canis_production” no nó localhost: 27017. Você não precisa fazer isso, mas é bom para certificar-se que irá escrevê-la em arquivo, em seguida, digite cada uma das funções.

Exemplo da Query Map Reduce


Este é um MapReduce simples. Ele está emitindo para cada campo url do documento e valor 1. O Redutor está adicionando valores para a mesma chave para que desta forma poderemos saber quantas ocorrências de cada url temos em toda coleção.








1
2
3
4
5
6
7
8


var map = function(){
emit(this.url, 1);
}
var reduce = function(key, values){
var res = 0;
values.forEach(function(v){ res += 1});
return {count: res};
}


Agora definimos a saida dos resultados da Query Map Reduce e tudo que precisamos fazer é executar a Query.








1


db.sites.mapReduce(map, reduce, { out: "mapped_urls" });


Para executar o MapReduce estamos usando a função MapReduce na Collection (este exemplo usa a collection denominada “sites”), o primeiro argumento é a função mapa, o segundo é reduzir a função e o terceiro é opção, mas muito útil, que é a coleta de saída onde os resultados serão armazenados em forma de documentos. Esta opção permite-nos executar a consulta no inicio da  noite e ver os resultados na manhã seguinte.

Vamos Testá-lo

Primeiro alguns dados de amostra
> db.sites.insert({url: "www.google.com", date: new Date(), trash_data: 5 });
> db.sites.insert({url: "www.mongodbwize.wordpress.com", date: new Date(), trash_data: 13 });
> db.sites.insert({url: "www.google.com", date: new Date(), trash_data: 1 });
> db.sites.insert({url: "www.mongodbwize.wordpress.com", date: new Date(), trash_data: 69 });
> db.sites.insert({url: "www.mongodbwize.wordpress.com", date: new Date(), trash_data: 256 });

Agora Funções e Consultas








1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


> var map = function(){
... emit(this.url, 1);
... }
> var reduce = function(key, values){
... var res = 0;
... values.forEach(function(v){ res += 1});
... return {count: res};
... }
> db.sites.mapReduce(map, reduce, { out: "mapped_urls" });
{
"result" : "mapped_urls",
"timeMillis" : 75,
"counts" : {
"input" : 5,
"emit" : 5,
"reduce" : 2,
"output" : 2
},
"ok" : 1,
}


Resultados








1
2
3


> db.mapped_urls.find({})
{ "_id" : "www.google.com", "value" : { "count" : 2 } }
{ "_id" : "www.mongodbwize.wordpress.com", "value" : { "count" : 3 } }


 

Mais informações em => http://www.mongodb.org/display/DOCS/MapReduce

0 comentários:

Postar um comentário

Blog Archive

SmarttNet Solution Provider. Tecnologia do Blogger.

Postagens populares

Twitter MongoDBBrazil

Total de visualizações de página