1

コレクション (20M 以上のドキュメントを含む) で集計メソッドを使用しようとしています。

私は最初にWindowsシェルで試しました:

db.data.aggregate([
{$match: {firstname: "Roger"}},
{$group:{"_id":"$id_car",count:{$sum: 1}}},
{$sort: {count: -1}},
{$limit: 50}])

そして、それは完全に機能し、数秒後に結果を返します.

PHPで「翻訳」すると:

$data = $db->data;
$ops = array(
    array(
         '$match' => array(
             'firstname' => 'Roger'
         )
    ),
    array(
        '$group' => array(
            '_id' => '$id_car',
            'count' => array(
                '$sum' => 1     
            )       
        )
    ),
    array(
        '$sort' => array(
            'count' => -1
        )
    ),
    array(
        '$limit' => 4       
    )
);
$res = $data->aggregate($ops);

タイムアウトの PHP Fatal error が表示されます:

Uncaught exception 'MongoCursorTimeoutException' with message 'localhost:27017: cursor timed out (timeout: 30000, time left: 30:0, status: 0)'

PHP コードを間違えたのか、それとも PHP では shell よりも Aggregate の方がはるかに遅いはずなのかわかりません。

また、「firstname」フィールドにインデックスを追加して、クエリを高速化しました。

ところで、この種の呼び出しのタイムアウトを無限に設定する方法はありますか?

助けてくれてありがとう!

ジョー

4

1 に答える 1