(PECL mongo >=0.9.0)
Un curseur est utiliser pour itérer les résultats d'une requête. Par exemple regarder tous les résultats d'une requête quelconque :
<?php
$cursor = $collection->find();
var_dump(iterator_to_array($cursor));
?>
En général, vous ne créez pas de MongoCursor en utilisant le constructeur mais en appelant MongoCollection::find() (comme ci-dessus).
Supposons que, dans l'exemple ci-dessus, $collection pèse 50Go. On ne voudra certainement pas tout charger en mémoire, c'est ce que permet un curseur : permettre au client d'accéder aux données au fur et à mesure.
Si nous avons des jeux de résultats très grands, nous pouvons itérer dessus, ceci chargera seulement quelques méga-octets dans la mémoire. Par exemple :
<?php
$cursor = $collection->find();
foreach ($cursor as $doc) {
// faire quelque chose avec chaque document $doc
}
?>
Notez que cela signifie qu'un curseur ne contient pas les données du jeu de résultats, il ne fait que les piloter. Ainsi si vous affichez un curseur (par exemple, avec var_dump() ou print_r()), vous n'obtiendrez que l'objet curseur, pas les documents. Pour obtenir les documents, vous pouvez utiliser une des techniques ci-dessus.
Un MongoCursor a 2 états différents : Avant et après la requête. Lorsqu'un curseur est crée, il n'a pas encore contacté la base de données, il est en état pré-requête et le client peut toujours préciser ce qu'il attend de la requête, par exemple ajouter des limites, des tris ou encore des options avancées.
Lorsque le client tente de récupérer un résultat (en appelant la fonction MongoCursor::next(), directement ou indirectement), le curseur passe à l'état post-requête. À ce moment-là, la requête a été exécutée par la base et ne peut plus être modifiée.
<?php
$cursor = $collection->find()->limit(10);
// la base n'a pas encore été interrogée,
// il est donc encore temps d'ajouter des options
$cursor = $cursor->sort(array("a" => 1));
var_dump($cursor->getNext());
// maintenant, la base a été interrogée, et les options ne sont plus prises en compte
// Cet commnande va produire une exception :
$cursor->skip(4);
?>
$connection
, string $ns
[, array $query
= array()
[, array $fields
= array()
]] )Est ce que la requête doit avoir le drapeau "slaveOkay" activé, ce qui permet des lectures sur l'esclave (les esclaves sont par défaut déstinés à des sauvegardes et donc inaccessibles en lectures). Peut être surchargé avec MongoCursor::slaveOkay().
Affecte le timeout en millisecondes pour les réponses des bases de données. Pour un timeout infini, utilisez -1. Peut être surchargé avec MongoCursor::timeout(). Ceci ne provoque pas une annulation de l'opération par le serveur MongoDB mais fait en sorte que le pilote s'arrête d'attendre une réponse et envoie une MongoCursorTimeoutException.
Documentation de MongoDB » concernant les curseurs.