1

を使用して mongo データセットの平均計算を実装しようとしてMongoCollection()::aggregate()いますが、関数は Cursor オブジェクトを返し、何が間違っているのかわかりません。

これは、データセット コンテンツのサンプルです。

{ 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()construct と simpleの両方でパイプライン配列を書き込もうとしました[]が、結果は変わりません。私が間違っていることは何ですか?ありがとう

4

1 に答える 1

3

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 拡張機能を使用してより明確な結果を確認できますが、この拡張機能は現在非推奨です。

于 2016-04-18T19:24:14.397 に答える