5 Stimmen

Cursor Timed out-Fehler bei MongoDb-Cursor

Ich habe gerade angefangen, mongoDb als Backend für PHP zu verwenden.

Ich bin einfach mit find() Abfrage für eine meiner Bedürfnisse. Ich möchte nur die ersten 100 Ergebnisse, aber auch die gesamten verfügbaren Ergebnisse erhalten. Ich versuche dies.

    $cursor = $this->dbReference->dbName->find($query);
    if($count != 0)
    {
            $cursor->skip($startIndex);
            $cursor->limit($count);
    }
    $totalCount = $cursor->count();

    $entries = array();
    while ($cursor->hasNext())
    {
            $cursor->next();
            $entry = $cursor->current();
            array_push($entries , $entry);
    }

Das Problem ist T ieses Suchergebnis enthält genau mehr als 50K Ergebnisse. Ich rufe aber immer nur 100 auf einmal ab. Ich verwende $cursor->count(), um die Gesamtzahl der verfügbaren Ergebniszeilen zu erhalten. In dieser Zeile wird der Fehler "Cursor timed out" angezeigt. Kann mir jemand sagen, was das Problem ist? oder was die Alternative ist, um die Gesamtzahl der Suchergebnisse zu ermitteln.

Vielen Dank im Voraus.

7voto

Nanhe Kumar Punkte 14132

Sie können das Problem mit der Zeitüberschreitung des Cursors lösen, indem Sie den folgenden Code vor find() :

MongoCursor::$timeout = -1;
$cursor = $this->dbReference->dbName->find($query);

1voto

danielgwood Punkte 212

Ich habe das gerade mit 100.000 einfachen Dokumenten ausprobiert. $totalCount ist für mich immer 100000, unabhängig davon, ob $count y $startIndex gesetzt sind (dies ist das richtige Verhalten). $entries enthält alle 100000 Einträge. Der gesamte Vorgang dauert bei meiner lokalen Installation etwa 3 Sekunden.

Verwenden Sie eine entfernte Datenbank? Es ist möglich, dass die Zeitüberschreitung durch das Netzwerk verursacht wird und nicht durch MongoDB.

Welche Größe haben Ihre Dokumente? Das Datenvolumen kann die Geschwindigkeit beeinflussen.

0voto

Salocin.TEN Punkte 474

Ich entdeckte, dass ->count() auch die Ausführungszeit bis zur Zeitüberschreitung in die Höhe treibt. Ich halte es für besser, einfach find() zu verwenden und dann das gewünschte Element im Cursor mit einer foreach-Schleife in ein Array zu stellen. Danach führen Sie eine array_count_values() auf dieses Array aus. Scheint auch ein bisschen schneller zu sein.

Vielen Dank für die MongoCursor::$timeout = -1 für Ich denke, es wirklich in meiner Situation auch geholfen.

Auf wundersame Weise gibt es keine schrecklichen Timeout-Meldungen mehr.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X