2016-04-18 3 views
1

Я пытаюсь реализовать средний расчет по набору данных mongo с использованием MongoCollection()::aggregate(), но функции возвращают объект Cursor, и я не могу понять, что я делаю неправильно.PHP MongoDB aggregation возвращает пусто

Это образец содержания набора данных:

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

Этот запрос трубопровод работает в Монго консоли:

{"$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]. Вам просто нужно применить метод toArray() к полученному MongoDB \ Driver \ Cursor. Нечто подобное (на основании вашего исходного кода):

<?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

Да, я просто понял, что возвращаемый объект был курсором вместо массива. Смешно, что я правильно преобразовал массив в аналогичный объект на пару строк над этой функцией. Я думаю, что пик Баллмера реальный –