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