MongoCollection::aggregateCursor

(PECL mongo >=1.5.0)

MongoCollection::aggregateCursorEjecutar un comando de tubería acumulador y recuperar los resultados mediante un cursor

Descripción

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

Con este método se pueden ejecutar tuberías del Marco de Acumulación y recuperar los resultados mediante un cursor, en lugar de obtener solamente un documento tal como se haría con MongoCollection::aggregate(). Este método devuelve un objeto MongoCommandCursor. Este objeto de cursor implementa la interfaz Iterator al igual que los objetos MongoCursor devueltos por el método MongoCollection::find().

Nota: El objeto MongoCommandCursor resultante heredará esta preferencia de lectura de colección. Se podría utilizar MongoCommandCursor::setReadPreference() para cambiar la preferencia de lectura antes de recorrer el cursor.

Parámetros

pipeline

La tubería del Marco de Acumulación a ejecutar.

options

Opciones para el comando acumulador. Las opciones válidas son:

  • "allowDiskUse"

    Permitir que los estados acumulados se escriban en ficheros temporales

  • "cursor"

    Es posible configurar cuántos documentos iniciales debería devolver el servidor con el primer conjunto de resultados. El tamaño predeterminado del lote inicial es 101. Se puede cambiar este valor añadiendo la opción batchSize:

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

    Esta opción solamente configura el tamaño del primer lote. Para configurar el tamaño de los demás lotes, emplee el método MongoCommandCursor::batchSize() del objeto MongoCommandCursor devuelto.

  • "explain"

    Devolver información del procesamiento de la tubería. Si fuera necesario usar esta opción, se debería considerar el empleo de MongoCollection::aggregate().

  • "maxTimeMS"

    Especifica un tiempo límite acumulativo en milisegundos para procesar la operación en el servdiro (no incluye el tiempo improductivo). Si la operación no la completa el servidor dentro del período de tiempo límite, se lanzará una MongoExecutionTimeoutException.

Valores devueltos

Devuelve un objeto MongoCommandCursor. Puesto que implementa la interfaz Iterator, se puede recorrer cada uno de los resultados mientras los devuelve la consulta de comando. MongoCommandCursor también implementa la interfaz MongoCursorInterface, la cual añade los métodos MongoCommandCursor::batchSize(), MongoCommandCursor::dead() y MongoCommandCursor::info().

Ejemplos

Ejemplo #1 Ejemplo de MongoCollection::aggregateCursor()

Encontrar todos los valores distintos de una clave.

<?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";
}

?>

El resultado del ejemplo sería algo similar a:


Molly: 130
Joe: 26
Sally: 22

Ejemplo #2 Ejemplo de MongoCollection::aggregateCursor() con un tamaño inicial de lote diferente

Encontrar todos los valores distintos de una clave.

<?php
$m 
= new MongoClient;
$db $m->test;
$people $db->people;
$people->drop();

/* Insert some sample data */
$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));

/* Run the command cursor */
$ages $people->aggregateCursor(
    [
        [ 
'$group' => [ '_id' => '$name''points' => [ '$sum' => '$points' ] ] ],
        [ 
'$sort' => [ 'points' => -] ],
    ],
    [ 
"cursor" => [ "batchSize" => ] ]
);

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

?>

El resultado del ejemplo sería algo similar a:


Molly: 130
Joe: 26
Sally: 22

Ver también

add a note add a note

User Contributed Notes 2 notes

up
3
Dmitriy
1 year 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
4 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