PHP MongoDB – Verwendung der aggregate-Befehl ohne die cursor-option ist veraltet. Was?

Habe ich aktualisiert mongo und jetzt im log die folgende Fehlermeldung angezeigt:
Verwendung der aggregate-Befehl ohne die cursor-option ist veraltet

Mongo sagt, ich sollte einen zweiten ERFORDERLICHEN parameter an Aggregat-Funktion, da meine derzeitige Verwendung ist veraltet.

Derzeit benutze ich den folgenden code in PHP (nun veraltet):

$this->db->{$collection}->aggregate($options);

Und geben Sie dieses format:

{"result":[
    {
    "_id":"xxxxxx",
    "update":[
    {
    "firstUpdateTime":xxxxxx,
    "updateTime":xxxxxxx,
    }
    ],
    "media":[
    {
    "xxxx":{ ...

, Um nicht mit einem veralteten code füge ich den neuen zweiten parameter (, aber ich verstehe nicht, was zu setzen):

$this->db->{$collection}->aggregate($options, array('cursor' => array('batchSize' => 101)));

Und dieser liefert die gleichen Informationen, aber variiert die anfängliche Struktur:

{"cursor":{
"id":{
"value":"xxxxxx"
},
"ns":"xxxxxx.instagram",
"firstBatch":[
{
"_id":"xxxxxx",
"update":[
{
"firstUpdateTime":xxxxxx,
"updateTime":xxxxxx,
}
],
"media":[
{
"xxxxxx":{ ...

Nach dem update Mongo zwingt mich zu ändern, wie ich die Daten Lesen.
Ich verstehe nicht, welchen Wert sollte ich im zweiten parameter namens „cursor“…

Was soll ich in diesem zweiten parameter?
Kann ich einen default-Wert zu verändern, ohne die Struktur der Ergebnisse?

Doc:
https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/
http://php.net/manual/es/mongocollection.aggregate.php

UPDATE:

Wenn ich an Sie den cursor in die Funktion habe ich nicht mehr die Fehlermeldung.
Aber ohne Anwendung auf die Lösung, ich habe den LOG Lesen und die Warnung wird angezeigt, zufällig, ich habe einen code, dass ich mehrmals ausgeführt, und manchmal, wenn es die Berichte der genannten warn-und andere nicht.

Warum?

  • Können Sie fügen Sie bitte den code inklusive der log-Meldungen mit und ohne cursor-option, die zeigen das Verhalten, das Sie erwähnt haben in dem update ?
  • rerer dieser Beitrag für den cursor benutzen.
InformationsquelleAutor ephramd | 2017-05-06



6 Replies
  1. 5

    Bei der Abfrage etwas zu MongoDB und Sie erwarten Ergebnisse, Sie werden dieses variable genannt cursor, das ist einfach ein Zeiger auf das Dokument, das Sie aktuell war zu Lesen. Es ist einfach wie eine scrollbar im browser.

    Können Sie angeben, wie viele Dokumente, die er Lesen sollte, in einen Puffer batchSize wie Sie es mit dem Wert 1.

    Es ist nützlich, wenn Sie wissen, wie viel Dokumente, die Sie erwarten, zu Lesen. Wenn Sie brauchen nur 10 Dokumente, Sie können bekommen all jene, die in einem einzigen Netzwerk-Paket mit batchSize => 10. Wenn Sie angeben batchSize => 5 wird es länger dauern, weil es braucht zwei Netzwerk-Pakete an die Datenbank, um die erwarteten 10 Dokumente.

    Sind Sie sicher mit der Standard –batchSize.

    Können Sie versuchen, Durchlaufen Sie den cursor mithilfe foreach wie in einem Beispiel in der Dokumentation: http://php.net/manual/en/class.mongocommandcursor.php

    Ich bin nicht sicher, ob der php.net die Dokumentation ist auf dem neuesten Stand mit der aktuellsten version des MongoDB-Treibers.

    • So weit hatte ich nicht zu befürchten, fehlende Daten seit Aggregat liefert alle Daten. Ich verstehe, dass die batchSize-Abbildung ist ähnlich wie ein „Grenzwert“ einer Abfrage. Was ist der Schnitt, wenn ich Ihnen 101? In meinem Beispiel der Ergebnisse, was wäre „das Dokument“ werden? Danke! @DanFromGermany
    • die batchSize ist für den Benutzer nicht sichtbar, hat aber Auswirkungen auf das Netzwerk und Speicher, weil, wenn Ihre Unterlagen passen nicht in den Puffer, wird der client den server aufrufen, wie „gib mir die nächsten 101 Dokumente“, so ist es nicht wirklich eine Grenze, denn Sie erhalten immer noch alle Dokumente.
  2. 2

    Verwenden Sie aggregateCursor gibt die cursor-Zeile anstelle von results nur.

    Etwas wie

    Ist die erste charge ist standardmäßig eingestellt, bei 101 Ergebnisse.

    $cur = $this->db->{$collection}->aggregateCursor($pipeline);

    Legen Sie die batchsize ( der zweite parameter von deiner Frage ) auf die gesamtwirtschaftliche cursor von 50 für die nachfolgenden Chargen. Wenn Sie nicht, verwenden Sie die folgende option wird die Standard zu Holen um 4 MB.

    $cur->batchSize( 50 );

    Kannst du nun Durchlaufen und Lesen Sie die Ergebnisse, um alle Dokumente.

    Dem server holt sich die erste) charge von 101 Dokumente auf der ersten Schleife, iteration mit anschließender batch-102 iteration und in Abständen von 50 auf den rest der Chargen bis Sie erschöpfen den cursor.

    foreach ( $cur as $result )
    {
       echo $result['_id'], "\n";
    }

    Zur Steuerung von batch-Größe für die erste Partie, die Sie angeben können batchSize als cursor-option, aber in der Regel ist es nicht erforderlich.

    $cur = $this->db->{$collection}->aggregateCursor($pipeline, 'cursor' => [ 'batchSize' => 1 ]);

    Referenz:
    https://derickrethans.nl/aggregation-cursor.html

  3. 2

    Aus der aktuellen MongoDB-Handbuch der Aggregat-operation geändert haben.

    Aggregat ohne cursor

    MongoDB 3.4 deprecates die Verwendung von Aggregat-Befehl, ohne den cursor
    option, es sei denn, die pipeline enthält die explain-option. Wenn
    Rückkehr aggregation der Ergebnisse inline mit der aggregate-Befehl,
    geben Sie die cursor-option über die Standard-batch-Größe cursor: {} oder
    geben Sie die batch-Größe in der cursor die option cursor: { batchSize:
    }.

    Können Sie einfach angeben, dass die parameter für Ihre Funktion rufen Sie mit dem hinzufügen von [ "cursor" => [ "batchSize" => 0 ] ] als zweiter parameter wird dieses Problem lösen. finden Sie hier.

    Können Sie auch beziehen sich auf diese SO Frage für die cursor-parameter Verwendung.

  4. 1

    Vorausgesetzt, Sie sind mit der neuesten MongoDB-PHP-Bibliothek, Sie sollten in der Lage sein, um pass 'useCursor' => false option (die Standardeinstellung ist true), wie in der doc.

    • Vielen Dank für die Beantwortung, aber ich bin nicht mit MongoDB-PHP-Bibliothek, die ich verwenden, der hat keine Schnittstelle und dieser doc ist nicht kompatibel mit mir. Ich benutze die verwiesen wird, in der Botschaft, obwohl dieser einen Fehler hat, nicht mehr aktualisiert.
    • Die Erweiterung, die Sie momentan verwenden, ist bereits veraltet. Also ich glaube nicht, dass es keine einfache Möglichkeit zu haben, die it-Unterstützung neueste version von MongoDB. Der doc empfiehlt MongoDB-Treiber in Verbindung mit MongoDB-PHP-Bibliothek statt
  5. 0

    Ersetzen diese :

    $dies->db->{$collection -}->Summe($options);

    mit folgenden code durch hinzufügen cursor-array.

    $dies->db->{$collection -}->Summe($Optionen), array(‚cursor’=>array(‚batchSize‘ => 1)));

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.