PHP 8.0.0 Released!

MongoCollection::aggregateCursor

(PECL mongo >=1.5.0)

MongoCollection::aggregateCursorВыполняет команду конвейера агрегации и получает результаты с помощью курсора

Описание

public MongoCollection::aggregateCursor ( array $command [, array $options ] ) : MongoCommandCursor

С помощью этого метода вы можете выполнять конвейеры структуры агрегации и получать результаты с помощью курсора, вместо того, чтобы возвращать только один документ, как это было бы с MongoCollection::aggregate(). Этот метод возвращает объект MongoCommandCursor. Этот объект курсора реализует интерфейс Iterator точно так же, как объекты MongoCursor, которые возвращаются методом MongoCollection::find().

Замечание: Результирующий MongoCommandCursor будет наследовать предпочтения чтения этой коллекции. MongoCommandCursor::setReadPreference() может использоваться для изменения предпочтения чтения перед итерацией курсора.

Список параметров

pipeline

Конвейер структуры агрегации для выполнения.

options

Опции для команды агрегации. Допустимые варианты:

  • "allowDiskUse"

    Разрешить этапы агрегации для записи во временные файлы

  • "cursor"

    Можно настроить, сколько исходных документов сервер должен вернуть с первым набором результатов. Начальный размер пакета по умолчанию - 101. Вы можете изменить его, добавив параметр batchSize:

    <?php
    $collection
    ->aggregateCursor
        
    $pipeline,
        [ 
    "cursor" => [ "batchSize" => ] ]
    );

    Эта опция только настраивает размер первого пакета. Чтобы настроить размер будущих пакетов, используйте метод 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' => -] ],
] );

foreach (
$ages as $person) {
    echo 
"{$person['_id']}{$person['points']}\n";
}

?>

Результатом выполнения данного примера будет что-то подобное:


Molly: 130
Joe: 26
Sally: 22

Пример #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' => -] ],
    ],
    [ 
"cursor" => [ "batchSize" => ] ]
);

foreach (
$ages as $person) {
    echo 
"{$person['_id']}{$person['points']}\n";
}

?>

Результатом выполнения данного примера будет что-то подобное:


Molly: 130
Joe: 26
Sally: 22

Смотрите также

add a note add a note

User Contributed Notes 2 notes

up
4
Dmitriy
2 years ago
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);
up
1
lukasz at endai dot com
5 years ago
It looks like maxTimeMS option in the latest release (1.5.8) is not valid anymore. Set \MongoCursor::$timeout before you call aggregateCursor()
To Top