2016-04-18 9 views
1

を使用してmongoデータセットの平均計算を実装しようとしていますが、この関数はCursorオブジェクトを返し、私が間違っていることを理解できません。PHP MongoDB集約が空に戻ります

このデータセットのコンテンツのサンプル:

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

このパイプラインクエリはMongoのコンソールで動作します。

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

これは私のコードです:

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 
{} 

*/ 

私が試してみましたarray()の構造と簡略化された[]の両方を持つパイプラインアレイを書き込むには、結果は変わりません。私は間違っているの?ありがとう

答えて

2

MongoDBドライバとmongo-php-libraryを使用しています。もしそうなら、結果はそうでなければならない。結果の[meanTime]フィールドに気付くことができます。結果として得られるMongoDB \ Driver \ CursorにtoArray()メソッドを適用するだけです。 (あなたの最初のコードに基づいて)このような 何か:

<?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, 
//)) 

また、適切に様々な方法を使用するライブラリのドキュメントを参照してくださいすることができます。

mongo.so拡張を使用すると、より明確な結果が表示されますが、この拡張機能は廃止されました。

+0

ええ、私はちょうど、返されたオブジェクトが配列ではなくカーソルであることに気付きました。面白いのは、配列の上に同様のオブジェクトをその関数の上に数行だけ正しく配置することです。私はバルマーのピークが本当だと思う –

関連する問題