MongoDB Map Reduce
Map-Reduce é um modelo de computação, significa simplesmente que a maior parte do trabalho (dados) de decomposição (MAP) para executar, em seguida, mesclar os resultados em um resultado final (REDUZIR).
MongoDB fornece uma Map-Reduce é muito flexível para análise de dados em larga escala também é bastante prático.
comando MapReduce
A seguir está a sintaxe básica de MapReduce:
>db.collection.mapReduce( function() {emit(key,value);}, //map 函数 function(key,values) {return reduceFunction}, //reduce 函数 { out: collection, query: document, sort: document, limit: number } )
Usando funções de MapReduce para alcançar as duas funções mapear e reduzir as funções, Mapa chamada de função emitem (chave, valor), percorrer a coleção em todos os registros, eo valor da chave é passado para a função Reduzir para processamento.
função de mapa deve chamar emitem (chave, valor) Retorna pares.
Parâmetro Descrição:
- função de mapeamento (gerar sequências de teclas como reduzir os parâmetros defunção): mapa.
- reduzir funções estatísticas, a tarefa é reduzir os valores-chave de função em um valor-chave, ou seja, a matriz de valores em um valor único valor..
- out resultados estatísticos conjunto armazenados (não especificar o uso de coleção temporária automaticamente excluídos depois de um cliente está desligado).
- uma condição de filtro deconsulta, apenas para cumprir as condições do documento será chamado função de mapa.(Query.limit, uma espécie pode misturar)
- tipo e vinculativa sort sort parâmetro (também um ex documento enviado para a função de mapa para classificar) limite, você pode otimizar o mecanismo de agrupamento
- limitar o número de documentos enviados para o limite superior da função de mapa (se não houver nenhum limite, só tipo de pouca utilidade)
Use MapReduce
Considere o seguinte estrutura de documento para armazenar artigos, documentos do usuário e armazena o campo de status do usuário artigo user_name:
>db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"active" }) WriteResult({ "nInserted" : 1 })
Agora vamos usar os postos de definir a função MapReduce para selecionar um artigo publicado (status: "ativo") e pelo pacote user_name calculada para cada usuário Posts:
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } )
Acima MapReduce saída é:
{ "result" : "post_total", "timeMillis" : 23, "counts" : { "input" : 5, "emit" : 5, "reduce" : 1, "output" : 2 }, "ok" : 1 }
Os resultados mostraram que um total de quatro correspondem aos critérios de consulta (status: "activos") documentos gerados quatro chave na função de mapa no documento, e então usar a mesma função para reduzir a tecla divididos em dois grupos.
parâmetros específicos:
- Resultado: armazenar os resultados do nome da coleção, este é um conjunto temporário de volta para fora da conexão automática de MapReduce foi excluída.
- timeMillis: a execução leva tempo, em milissegundos
- input: o número de condição de o documento é enviado para a função de mapa
- emitem: vezes em função de mapa emitem é chamado, ou seja, a quantidade total de toda a colecção de dados
- ouput: Resultados Número de documentos na coleção (contagem é muito útil para depuração)
- ok: sucesso, sucesso 1
- errar: Se ele falhar, pode haver uma razão para falhar, mas a partir da experiência, a razão é vago, não é muito útil
Usando o operador de localização para ver o resultado da consulta MapReduce de:
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find()
Os resultados da consulta acima é mostrada abaixo, há dois usuários de tom e marcar dois artigos publicados:
{ "_id" : "mark", "value" : 4 } { "_id" : "w3big", "value" : 1 }
De uma maneira similar, MapReduce pode ser usado para construir, consultas agregadas grandes complexos.
função de mapa e reduzir as funções podem ser implementadas usando JavaScript, MapReduce fazer uso de muito flexível e poderosa.