Агрегация PHP MongoDB возвращает пустой

Я пытаюсь реализовать средний расчет по набору данных Монго, используя 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() построить и упростить [], но результат не изменился. Что я делаю не так? Спасибо

1

Решение

Вы используете драйвер MongoDB и Монго-PHP-библиотека Похоже. Если так, то результат такой, какой должен быть. Вы могли заметить поле [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, чтобы увидеть более четкий результат, но это расширение устарело.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]