Mapa/Reduzir
Nesta página
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.
Execução
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.
Resultados brutos
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>}
Estatísticas
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étodosemitted
ereduced
recebem um nome diferente das chaves de hash emcounts
.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.