aggregateCursor with mongoDB 3.6 can cause error:
"the command cursor did not return a correctly structured response"
to fix it on 64 bit systems, temporarily turn on:
ini_set('mongo.long_as_object', true);
(PECL mongo >=1.5.0)
MongoCollection::aggregateCursor — Выполняет команду конвейера агрегации и получает результаты с помощью курсора
С помощью этого метода вы можете выполнять конвейеры структуры агрегации и получать результаты с помощью курсора, вместо того, чтобы возвращать только один документ, как это было бы с MongoCollection::aggregate(). Этот метод возвращает объект MongoCommandCursor. Этот объект курсора реализует интерфейс Iterator точно так же, как объекты MongoCursor, которые возвращаются методом MongoCollection::find().
Замечание: Результирующий MongoCommandCursor будет наследовать предпочтения чтения этой коллекции. MongoCommandCursor::setReadPreference() может использоваться для изменения предпочтения чтения перед итерацией курсора.
pipeline
Конвейер структуры агрегации для выполнения.
options
Опции для команды агрегации. Допустимые варианты:
"allowDiskUse"
Разрешить этапы агрегации для записи во временные файлы
"cursor"
Можно настроить, сколько исходных документов сервер должен вернуть с
первым набором результатов. Начальный размер пакета по умолчанию - 101
.
Вы можете изменить его, добавив параметр batchSize
:
<?php
$collection->aggregateCursor(
$pipeline,
[ "cursor" => [ "batchSize" => 4 ] ]
);
Эта опция только настраивает размер первого пакета. Чтобы настроить размер будущих пакетов, используйте метод MongoCommandCursor::batchSize() в возвращенном объекте MongoCommandCursor.
"explain"
Вернуть информацию об обработке конвейера. Эта опция может привести к тому, что команда вернет результирующий документ, который не подходит для создания MongoCommandCursor. Если вам нужно использовать эту опцию, вы должны рассмотреть возможность использования MongoCollection::aggregate().
"maxTimeMS"
Указывает суммарный лимит времени в миллисекундах на обработку операции (не включая время простоя) на сервере. Если операция на стороне сервера не завершилась за это время, то вызывается исключение MongoExecutionTimeoutException.
Возвращает объект MongoCommandCursor. Поскольку он реализует интерфейс Iterator, вы можете перебирать каждый из результатов, возвращаемых запросом команды. MongoCommandCursor также реализует интерфейс MongoCursorInterface, который добавляет методы MongoCommandCursor::batchSize(), MongoCommandCursor::dead(), MongoCommandCursor::info().
Пример #1 Пример использования MongoCollection::aggregateCursor()
Поиск всех различных значений для ключа.
<?php
$m = new MongoClient;
$db = $m->test;
$people = $db->people;
$people->drop();
$people->insert(array("name" => "Joe", "points" => 4));
$people->insert(array("name" => "Molly", "points" => 43));
$people->insert(array("name" => "Sally", "points" => 22));
$people->insert(array("name" => "Joe", "points" => 22));
$people->insert(array("name" => "Molly", "points" => 87));
$ages = $people->aggregateCursor( [
[ '$group' => [ '_id' => '$name', 'points' => [ '$sum' => '$points' ] ] ],
[ '$sort' => [ 'points' => -1 ] ],
] );
foreach ($ages as $person) {
echo "{$person['_id']}: {$person['points']}\n";
}
?>
Результатом выполнения данного примера будет что-то подобное:
Пример #2 Пример использования MongoCollection::aggregateCursor() с другим начальным размером пакета
Поиск всех различных значений для ключа.
<?php
$m = new MongoClient;
$db = $m->test;
$people = $db->people;
$people->drop();
/* Вставьте пример данных */
$people->insert(array("name" => "Joe", "points" => 4));
$people->insert(array("name" => "Molly", "points" => 43));
$people->insert(array("name" => "Sally", "points" => 22));
$people->insert(array("name" => "Joe", "points" => 22));
$people->insert(array("name" => "Molly", "points" => 87));
/* Запустите командный курсор */
$ages = $people->aggregateCursor(
[
[ '$group' => [ '_id' => '$name', 'points' => [ '$sum' => '$points' ] ] ],
[ '$sort' => [ 'points' => -1 ] ],
],
[ "cursor" => [ "batchSize" => 4 ] ]
);
foreach ($ages as $person) {
echo "{$person['_id']}: {$person['points']}\n";
}
?>
Результатом выполнения данного примера будет что-то подобное:
aggregateCursor with mongoDB 3.6 can cause error:
"the command cursor did not return a correctly structured response"
to fix it on 64 bit systems, temporarily turn on:
ini_set('mongo.long_as_object', true);
It looks like maxTimeMS option in the latest release (1.5.8) is not valid anymore. Set \MongoCursor::$timeout before you call aggregateCursor()