2016-03-19 13 views
2

Wenn ich eine Schleife hatte:MongoDB Schreib um Node.js

for (var i = 0; i <= 100; i++) { 
    collection.updateOne(query, { 
    $set: { 
     number: i 
    } 
    }); 
} 

würde ich garantiert werden, dass das letzte Update gesendet das in der Datenbank gespeichert wäre, oder gibt es eine Chance, dass eine oder mehrere der Die Updates können außerhalb der Reihenfolge eintreffen?

Wenn Aktualisierungen außerhalb der Reihenfolge ankommen, in der sie gesendet wurden, gibt es eine Möglichkeit, die Updates in der richtigen Reihenfolge zu erhalten, ohne auf eine Antwort von der Datenbank warten zu müssen (muss funktionieren können) innerhalb einer synchronen Schleife).

Antwort

2

würde ich, dass das letzte Update garantiert werden gesendet derjenige in der Datenbank

nein, nicht so, wie Sie diesen Code geschrieben haben, gespeichert wäre.

gibt es eine Möglichkeit zu garantieren, dass die Updates in der Reihenfolge ankommen, ohne auf eine Antwort von der Datenbank zwischen dem Senden jeder zu warten (müsste innerhalb einer synchronen Schleife arbeiten können).

wieder, nein. nicht ohne einen Callback zu verwenden, um auf den Abschluss der Operation zu warten, bevor mit dem nächsten fortgefahren wird.

Die beste Option besteht darin, eine asynchrone Iteration zu verwenden, aber die Iteration auf das nächste Element zu verzögern, bis das vorherige abgeschlossen ist.

Ich habe einen Blogpost über serially iterating an array, asynchronously, der Ihnen zeigt, wie man das macht.

2

Wenn Sie garantiert bestellen möchten, verwenden Sie Bulk Operationen mit initializeorderedbulkop

Beispiel:

var bulk = db.collection.initializeOrderedBulkOp(); 

for(var i=0;i <= 100; i++){ 
    bulk.find({ ... }).updateOne(
     { 
      $set:{number:1} 
     } 
    ); 
} 

bulk.execute(); 
+0

oh, schön! Ich wusste nichts davon. Ich muss das nächste Mal machen, wenn ich das brauche. :) –

+0

In meinem Fall müssten sie separate Operationen sein, aber unter Umständen mit Geschwindigkeiten durchgeführt, als wären sie in einer Schleife. Gut zu wissen, dass dies jedoch existiert. – user2248702

+0

bulk akzeptiert alle Arten von Operationen und wird in der Reihenfolge ausgeführt, in der sie in großen Mengen angezeigt werden. Siehe Dokumentation. – Saleem