2016-06-16 1 views
1

code:MongoCursorException - Cursor not found (PHP MongoDB Driver)

try { 
    $documentsFind = $client->$db->$collection->find([ 
     // query 
    ]); 
    if ($documentsFind) { 
    foreach ($documentsFind as $product) { 
    // code... 
    } 
    } 
catch (MongoCursorException $e) { 
    echo "error message: ".$e->getMessage()."\n"; 
    echo "error code: ".$e->getCode()."\n"; 
} 

Erreur:

Fatal error: Uncaught MongoDB\Driver\Exception\RuntimeException: Cursor not found, cursor id: 31837896248 in ...

Il semble que le curseur existe mais fois sur? Comment puis-je empêcher cela?

Edité pour ajouter: J'ai essayé de faire:

if ($documentsFind) { 
    $documentsFind->immortal(true); // keep alive 
    foreach ($documentsFind as $product) { 
    // code... 
    } 
    } 

Mais qui se traduit par Call to undefined method MongoDB\Driver\Cursor::immortal().

+0

L'erreur apparaît sur la première manche ou sont vous avez la possibilité de charger des entrées? – cb0

+0

Il récupère un certain nombre de documents de la base de données mais expire à un moment donné. J'ai été capable de court-circuiter temporairement avec 'mongod --setParameter cursorTimeoutMillis = 9000000' – 3zzy

Répondre

3

Essayez d'interroger comme ceci:

$documentsFind = $client->$db->$collection->find([ 
    // query 
], ['noCursorTimeout' => true]); 

find() méthode passe le 2e argument au constructeur de la classe Find, de sorte que vous pouvez voir toutes les options disponibles here

1

Cursor exception dit,

Le pilote a essayé de chercher plus de résultats de la base de données, mais la base de données n'a pas un enregistrement de la requête. Cela signifie généralement que le curseur a expiré du côté serveur: après quelques minutes d'inactivité, la base de données détruit un curseur.

Le MongoDB pilote PHP a deux temps morts différents:

  1. Délai de connexion
  2. délai d'attente du curseur

Assurez-vous que vous utilisez délai d'attente ou immortelles sur le curseur:

$cursor = $collection->find(); 
$cursor->immortal(true); 
$cursor->timeout(-1); 

Remarque: Timeout indique l'heure d'attente sur le client sid e tandis que immortal place le curseur sur le côté serveur.

Mais je suggère si vous avez le curseur de la grande taille des données vous devez récupérer les données de curseur en morceaux comme:

Obtenir les 1000 premiers documents de la collection, les processus. Ensuite, obtenez les 1000 prochains documents. Vous pouvez le faire en sautant et en limitant.

+1

Essayé tout cela. Il semble que 'immortal' et' timeout' ne sont pas disponibles sur le nouveau pilote PHP 'mongodb', pas' mongo'. – 3zzy

+0

Quelle version de mongodb vous utilisez? Obtenez-vous un objet curseur pour find()? Quel pilote php mongo avez-vous? @ 3zzy –