Latest web development tutorials

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.