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 — Ejecutar un comando de tubería acumulador y recuperar los resultados mediante un cursor
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.
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" => 4 ] ]
);
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.
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().
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' => -1 ] ],
] );
foreach ($ages as $person) {
echo "{$person['_id']}: {$person['points']}\n";
}
?>
El resultado del ejemplo sería algo similar a:
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' => -1 ] ],
],
[ "cursor" => [ "batchSize" => 4 ] ]
);
foreach ($ages as $person) {
echo "{$person['_id']}: {$person['points']}\n";
}
?>
El resultado del ejemplo sería algo similar a:
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()