1

集計関数を使用して Mongo コレクションからデータを取得しようとしていますが、MongoCursorTimeoutException が発生しています。一度に 50 レコードのみを選択しようとしていますが、コレクションには 17M を超えるレコードがあります。これは PHP から行われ、私のコードは次のとおりです。

$data = $my_collection->aggregate(array(
                                   array('$match'=>$filter_query),
                                   array('$group'=>array('_id'=>'$email')), 
                                   array('$skip'=>$offset),    
                                   array('$limit'=>$per_page)
                                 ));

$filter_query は、timestmap を含む別の配列であり、次のようになります。

Array
(
    [timestamp] => Array
        (
            [$gt] => 1383890400
            [$lt] => 1384495200
        )

)

50 レコードのみをフェッチしようとしているので、なぜこれが起こっているのかわかりません。すべてのレコードを選択した後に攻撃が実行され、エラーが発生していると思います。侵略以外にこれを行うためのより良い方法はありますか?

タイムアウトを -1 に設定できますが、ドライバーが最初の応答を得るまで永遠に待機するため、これは適切なオプションでしょうか?

4

1 に答える 1

5

集計関数のタイムアウト オプションを設定するcommandには、MongoDB オブジェクト インスタンスの関数を使用する必要があります。例えば:

$result = $database->command(
array(
    'aggregate' => $my_collection,
    'pipeline' => array(
        array('$match' => $filter_query),
        array('$group' => array('_id'=>'$email')),
                    array('$skip'=>$offset),
        array('$limit'=>$per_page)
    )
),
array( 'timeout' => $timeout )
);

詳細については、ドキュメントを参照してください

于 2013-11-15T08:46:21.987 に答える