2013-10-02 1 views
1

J'ai besoin de comprendre une fonction MongoCollection-> group(). manuel PHP pour le groupe() indique ce qui suit:Plusieurs push avec reduce() dans PHP MongoCollection-> group()

<?php 

$collection->insert(array("category" => "fruit", "name" => "apple")); 
$collection->insert(array("category" => "fruit", "name" => "peach")); 
$collection->insert(array("category" => "fruit", "name" => "banana")); 
$collection->insert(array("category" => "veggie", "name" => "corn")); 
$collection->insert(array("category" => "veggie", "name" => "broccoli")); 

$keys = array("category" => 1); 

$initial = array("items" => array()); 

$reduce = "function (obj, prev) { prev.items.push(obj.name); }"; 

$g = $collection->group($keys, $initial, $reduce); 

echo json_encode($g['retval']); 

?> 

avec un tableau de résultat similaire à:

[{"category":"fruit","items":["apple","peach","banana"]},{"category":"veggie","items":["corn","broccoli"]}] 

maintenant, je vois que la fonction MongoCode réduire() pousse le nom de l'élément dans la tableau de résultats. Mais que faire si je veux pousser un autre champ en plus du nom, c'est-à-dire couleur du fruit?

fondamentalement, ce que je besoin est d'avoir une sortie comme ceci:

[{"category":"fruit","items":[["apple", "red"],["peach", "peach"],["banana", "yellow"]]},{"category":"veggie","items":[["corn", "yellow"],["broccoli", "green"]]}] 

donc je pense que je devrais pousser() différemment d'une certaine manière ... comment exactement? Je ne trouve pas la bonne syntaxe nulle part.

merci à l'avance et désolé pour mon pauvre anglais :-)

Francesco

Répondre

2

Je cloué! c'est beaucoup plus simple que je ne le pensais. Tout est JavaScript! Tout ce que vous avez à faire est de construire votre propre tableau (même associatif), puis de le pousser dans le tableau principal que vous avez nommé lors de l'appel de la fonction reduce().

est ici un exemple:

$reduce = "function (obj, prev) { prev.items.push([obj.name, obj.color]); }"; 

effectivement travaillé, mais je voulais plus: un tableau associatif. donc je l'ai fait:

reduce = 'function (obj, prev) { 
     var tempArr = { 
      "name" : obj.name, 
      "color" : obj.color, 
     }; 
     prev.pages.push(tempArr); 
    }'; 

et tout le monde a vécu heureux pour toujours.

0

En ce moment, le « nom » clé est une chaîne contenant les noms de fruits. Essayez de stocker un tableau dans quelque chose « name » comme ci-dessous:

$collection->insert(array("category" => "fruit", "name" => array("apple", "red"))); 

Je ne sais pas quoi que ce soit au sujet de MongoDB mais juste pensé à la logique. Cela pourrait vous aider.

+0

merci @rajesh. Je l'ai élaboré et posté une solution. – godzillante

0

@rajesh J'ai étudié plus en détail le problème. c'est peut-être juste une question d'utilisation correcte du Javascript interne de MongoCode.

qui est, en utilisant probablement la poussée fonction() comme celui-ci

$reduce = "function (obj, prev) { prev.items.push([obj.name, obj.color]); }"; 

pourrait faire l'affaire. Je vais le tester demain et, je l'espère, déposer la bonne réponse.

EDIT réponse a été publiée