Exemple #3 Exemple avec MongoDB::command() et MapReduce
Récupérer tous les utilisateurs avec au moins un événement "sale",
et savoir le nombre de fois chacun de ces utilisateurs ont eu une vente.
<?php // Document d'événement simple$events->insert(array("user_id"=>$id,"type"=>$type,"time"=> newMongoDate(),"desc"=>$description));// Construit les fonctions map et reduce$map= newMongoCode("function() { emit(this.user_id,1); }");$reduce= newMongoCode("function(k, vals) { "."var sum = 0;"."for (var i in vals) {"."sum += vals[i];"."}"."return sum; }");$sales=$db->command(array("mapreduce"=>"events","map"=>$map,"reduce"=>$reduce,"query"=> array("type"=>"sale"),"out"=> array("merge"=>"eventCounts")));$users=$db->selectCollection($sales['result'])->find();
foreach ($usersas$user) {
echo"{$user['_id']}had{$user['value']}sale(s).\n";
}?>
Résultat de l'exemple ci-dessus est similaire à :
User 47cc67093475061e3d9536d2 had 3 sale(s).
User 49902cde5162504500b45c2c had 14 sale(s).
User 4af467e4fd543cce7b0ea8e2 had 1 sale(s).
Note:
Utilisation de MongoCode
Cet exemple utilise la méthode MongoCode,
qui prend également comme argument le scope. Cependant, actuellement,
Mongo ne supporte pas l'utilisation d'un scope dans MapReduce. Si vous voulez
utiliser des variables définies côté client dans les fonctions MapReduce,
vous pouvez les ajouter au scope global en utilisant le champ optionnel scope
avec la commande de la base de données. Voir la
» documentation
de MapReduce pour plus d'informations.
Note:
L'argument out
Avant la version 1.8.0, l'argument out était optionnel.
Si vous ne l'utilisiez pas, les résultats de MapReduce étaient écrits dans une
collection temporaire, qui était supprimée lors de la fermeture de la collection.
En version 1.8.0+, l'argument out est obligatoire.
Reportez-vous à la
» documentation sur MapReduce
pour plus d'informations.