Menu Docs
Página inicial do Docs
/ / /
Mongoid
/

Mapa/Reduzir

Nesta página

  • Execução
  • Resultados brutos
  • Estatísticas

O Mongoid fornece um DSL em torno da estrutura de mapeamento/redução do MongoDB, para executar trabalhos de mapeamento/redução personalizados ou agregações simples.

Observação

A operação map-reduce está obsoleta. Aestrutura de agregação do fornece melhor desempenho e usabilidade do que as operações de map-reduce , e deve ser preferida para novos desenvolvimentos.

Você pode diferenciar o Mongoid da classe ou de um critério para executar um mapa/redução chamando map_reduce e fornecendo as funções JavaScript de mapa e redução.

map = %Q{
function() {
emit(this.name, { likes: this.likes });
}
}
reduce = %Q{
function(key, values) {
var result = { likes: 0 };
values.forEach(function(value) {
result.likes += value.likes;
});
return result;
}
}
Band.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: 1)

Assim como os critérios, as chamadas de mapa/redução são avaliadas preguiçosamente. Portanto, nada atingirá o banco de dados de dados até que você itere sobre os resultados ou faça uma chamada no wrapper que precisaria forçar um acesso ao banco de dados de dados.

Band.map_reduce(map, reduce).out(replace: "mr-results").each do |document|
p document # { "_id" => "Tool", "value" => { "likes" => 200 }}
end

A única coisa necessária que você fornece junto com um mapa/redução é onde produzir os resultados. Se você não fornecer isso, um erro será gerado. As opções válidas para #out são:

  • inline: 1: Não armazene a saída em uma coleção.

  • replace: "name": Armazene em uma coleção com o nome fornecido e substitua quaisquer documentos existentes nela.

  • merge: "name": Armazene em uma coleção com o nome fornecido e mescle os resultados com os documentos existentes.

  • reduce: "name": Armazene em uma collection com o nome fornecido e reduza todos os resultados existentes nessa collection.

Os resultados da execução do Mapeamento/Redução podem ser recuperados por meio do método execute ou de seus aliases raw e results:

mr = Band.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: 1)
mr.execute
# => {"results"=>[{"_id"=>"Tool", "value"=>{"likes"=>200.0}}],
"timeMillis"=>14,
"counts"=>{"input"=>4, "emit"=>4, "reduce"=>1, "output"=>1},
"ok"=>1.0,
"$clusterTime"=>{"clusterTime"=>#<BSON::Timestamp:0x00005633c2c2ad20 @seconds=1590105400, @increment=1>, "signature"=>{"hash"=><BSON::Binary:0x12240 type=generic data=0x0000000000000000...>, "keyId"=>0}},
"operationTime"=>#<BSON::Timestamp:0x00005633c2c2aaf0 @seconds=1590105400, @increment=1>}

Servidores MongoDB 4.2 e inferiores fornecem estatísticas de execução do Map/Reduce. A partir do MongoDB 4.4, O Map/Reduce é implementado por meio do pipeline de agregação e as estatísticas descritas nesta seção não estão disponíveis.

Os seguintes métodos são fornecidos no objeto MapReduce :

  • counts: Número de documentos lidos, emitidos, reduzidos e gerados por meio do pipeline.

  • input, emitted, reduced, output: métodos de contagem individual. Observe que os métodos emitted e reduced recebem um nome diferente das chaves de hash em counts.

  • time: o tempo, em milissegundos, que o pipeline de mapeamento/redução levou para ser executado.

O seguinte código ilustra a recuperação das estatísticas:

mr = Band.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: 1)
mr.counts
# => {"input"=>4, "emit"=>4, "reduce"=>1, "output"=>1}
mr.input
# => 4
mr.emitted
# => 4
mr.reduced
# => 1
mr.output
# => 1
mr.time
# => 14

Observação

Cada invocação de método de estatística reexecuta o pipeline de mapeamento/redução. Os resultados da execução não são armazenados pelo Mongoid. Considere utilizar o método execute para recuperar os resultados brutos e obter as estatísticas a partir dos resultados brutos se desejar múltiplas estatísticas.

Voltar

Pipeline de agregação