Obtener todos los usuarios con al menos un evento de venta ("sale"), y cuántas veces
han realizado ventas cada uno de esos usuarios.
<?php
// documento de eventos de ejemplo
$eventos->insert(array("user_id" => $id,
"type" => $tipo,
"time" => new MongoDate(),
"desc" => $descripción));
// construcción del mapa y función reductora
$mapa = new MongoCode("function() { emit(this.user_id,1); }");
$reductora = new MongoCode("function(k, vals) { ".
"var sum = 0;".
"for (var i in vals) {".
"sum += vals[i];".
"}".
"return sum; }");
$sales = $bd->command(array(
"mapreduce" => "events",
"map" => $mapa,
"reduce" => $reductora,
"query" => array("type" => "sale"),
"out" => array("merge" => "eventCounts")));
$usuarios = $bd->selectCollection($sales['result'])->find();
foreach ($usuarios as $usuario) {
echo "El usuario {$usuario['_id']} realizó {$usuario['value']} venta(s).\n";
}
?>
El resultado del ejemplo
sería algo similar a:
Nota:
Usando MongoCode
Este ejemplo utiliza MongoCode, que puede utilizar también un
argumento de ámbito. Sin embargo, por el momento, MongoDB no admite el uso de
ámbitos en MapReduce. Si fuera necesario usar variables en el lado del cliente con las
funciones MapReduce, puede añairlas al ámbito global usando el campo opcional de
ámbito con la orden de la base de datos. Consulte la
» documentación de MapReduce
para más información.
Nota:
El argumento out
Antes de 1.8.0, el argumento out era opcional. Si no se iba
a usar, los resultados de MapReduce se escribían a una colección temporal,
que se eliminaba cuando se cerraba la conexión. A partir de la versión 1.8.0, el
argumento out es obligatorio. Consulte la
» documentación de MapReduce
para más información.