2016-04-18 14 views
1

Ich versuche, eine durchschnittliche Berechnung über ein Mongo-Dataset mit MongoCollection()::aggregate() zu implementieren, aber die Funktionen gibt ein Cursor-Objekt zurück und ich kann nicht herausfinden, was ich falsch mache.PHP MongoDB Aggregation gibt leer

Dies ist eine Probe des Datensatzes Inhalt:

{ word : "word", time : 1234, result : "pass" } 

Diese Pipeline-Abfrage in der Mongo-Konsole funktioniert:

{"$group" : 
    {"_id" : "$result", 
    "meanTime" : {"$avg" :"$time"} 
    } 
} 

Dies ist mein Code:

public function getTimes($fields = array('correct','wrong','pass')){ 


    $group = ['$group'=> ["_id" => '$result', "meanTime" => ['$avg' =>'$time']]]; 

    $agg = $this->collection->aggregate(
        [$group] 
        ); 
    return $agg; 

} 
/* 
//This is the var_dump on $agg 
object(MongoDB\Driver\Cursor)#82 (2) { 
["cursor"]=> 
array(17) { 
["stamp"]=> 
int(0) 
["is_command"]=> 
bool(false) 
["sent"]=> 
bool(true) 
["done"]=> 
bool(false) 
["end_of_event"]=> 
bool(false) 
["in_exhaust"]=> 
bool(false) 
["has_fields"]=> 
bool(false) 
["query"]=> 
object(stdClass)#76 (0) { 
} 
["fields"]=> 
    object(stdClass)#74 (0) { 
    } 
    ["read_preference"]=> 
    array(2) { 
    ["mode"]=> 
     int(1) 
     ["tags"]=> 
     array(0) { 
    } 
    } 
    ["flags"]=> 
    int(0) 
    ["skip"]=> 
    int(0) 
    ["limit"]=> 
    int(0) 
    ["count"]=> 
    int(2) 
    ["batch_size"]=> 
    int(0) 
    ["ns"]=> 
    string(23) "circular.intesavincente" 
["current_doc"]=> 
    object(stdClass)#83 (2) { 
    ["_id"]=> 
     string(4) "pass" 
["meanTime"]=> 
     float(338) 
    } 
    } 
    ["server_id"]=> 
    int(1) 
} 

//This is the json_encode output 
{} 

*/ 

ich versucht habe, Schreiben Sie das Pipeline-Array mit array() konstruieren und vereinfacht [], aber das Ergebnis ist unverändert. Was mache ich falsch? Danke

Antwort

2

Sie verwenden den MongoDB-Treiber und mongo-php-library ich denke. Wenn ja, ist das Ergebnis so, wie es sein sollte. Sie konnten das Feld [meanTime] im Ergebnis sehen. Sie müssen nur die Methode toArray() auf den resultierenden MongoDB \ Driver \ Cursor anwenden. So etwas wie diese (basierend auf dem ursprünglichen Code):

<?php 
require 'vendor/autoload.php'; 

class Timer 
{ 
    public $collection; 

    public function getTimes() 
    { 
     $group = [ 
      '$group' => [ 
       "_id"  => '$result', 
       "meanTime" => [ 
        '$avg' => '$time', 
       ], 
      ], 
     ]; 

     return $this->collection->aggregate([$group]); 
    } 
} 

$timer = new Timer; 
$m = new MongoDB\Client(); 
$db = $m->test; 
$timer->collection = $db->so; 
$cursor = $timer->getTimes(); 
$result = $cursor->toArray(); 
echo var_export($result[0]->bsonSerialize(), false); 

// 
// stdClass::__set_state(array(
// '_id' => 'pass', 
// 'meanTime' => 1234, 
//)) 

Sie können auch richtig die Bibliothek Dokumentation mit verschiedenen Methoden sehen.

Sie könnten die Erweiterung mongo.so verwenden, um ein eindeutigeres Ergebnis zu sehen, aber diese Erweiterung ist jetzt veraltet.

+0

Ja, ich habe gerade festgestellt, dass das zurückgegebene Objekt ein Cursor anstelle eines Arrays war. Komische Sache ist, dass ich korrekt konvertiert habe, um ein ähnliches Objekt ein paar Zeilen über dieser Funktion anzuordnen. Ich denke, Ballmers Gipfel ist echt –