2016-06-16 11 views
1

コードにMongoCursorException - 見つからないカーソル(MongoDBのPHPドライバ)

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

エラー

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

外にカーソルが存在しないようだが、回?それをどうやって防ぐことができますか?

編集がを追加する:私はやってみました:

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

しかし、それはCall to undefined method MongoDB\Driver\Cursor::immortal()になります。

+0

を見ることができ、エラーは最初の実行時に表示されるかされませんいくつかのエントリを読み込むことができますか? – cb0

+0

DBからかなりの数のドキュメントを取り出しますが、ある時点でタイムアウトします。 'mongod --setParameter cursorTimeoutMillis = 9000000'でこれを一時的に回避することができました。 – 3zzy

答えて

3

は次のようにクエリを実行してみてください。

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

find()方法はFindクラスのコンストラクタに第二引数を渡すので、あなたはすべての利用可能なオプションにhere

1

Cursor exception

ドライバがデータベースからより多くの結果を取得しようとしていた、と言いますが、データベースは、クエリのレコードを持っていませんでした。これは、通常、カーソルがサーバー側でタイムアウトしたことを意味します。数分間使用しないと、データベースはカーソルを強制終了します。

のMongoDB PHPドライバは、2つの異なるタイムアウトがあります。

  1. 接続タイムアウト
  2. カーソルタイムアウト

はあなたがカーソルにタイムアウトまたは不滅を使用していることを確認してください:

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

注:Timeoutは、クライアントのsidで待機する時間を示しますeはimmortalはサーバー側にカーソルを設定します。

しかし、私はあなたがビッグデータサイズのカーソルを持っている場合、あなたは以下のようにチャンクでカーソル・データをフェッチする必要があります示唆している:それらを処理し、コレクションから最初の1000件のドキュメントを入手

。それから、次の1000件の文書を入手してください。スキップして制限することでこれを行うことができます。

+1

そのすべてを試しました。 'immongal'と' timeout'は 'mongo'ではなく、新しいPHPドライバ' mongodb'で利用できないようです。 – 3zzy

+0

あなたはどのmongodbのバージョンを使用していますか? find()のカーソルオブジェクトを取得していますか?どのphon mongoドライバをお持ちですか? @ 3zzy –

関連する問題