2016-08-15 6 views
0

Ich habe einen Cluster von Knoten-Worker-Servern, die das Auftreffen auf eine API und das Einfügen von Daten in eine Mongo-Datenbank behandeln. Das Problem, das ich habe, ist, dass eine dieser Funktionen so oft erscheint, dass zwei Kopien desselben Dokuments eingefügt werden. Es prüft, ob das Dokument bereits mit einer Abfrage wie so erstellt worden:Knotencluster: Stellen Sie sicher, dass jeweils nur eine Instanz einer Funktion ausgeführt wird

gameDetails.findOne({ gameId: gameId }, function(err, gameCheck) { 

      if (!gameCheck) { //insert the document }; 

Wie kann ich sicherstellen, dass diese Funktion immer nur zu einem Zeitpunkt eine Instanz ausgeführt wird. Alternativ, wenn ich das tatsächliche Grundproblem nicht abgeleitet habe, was könnte eine Mongo-Abfrage wie diese dazu führen, dass manchmal ein und dasselbe Dokument mit der gleichen gameId eingefügt wird?

Antwort

0

FindOne wird mehrmals aufgerufen wird, bevor das Dokument Zeit eingeführt werden hat, das heißt in etwa wie folgt geschieht:

findThenInsert() findThenInsert() findThenInsert() // findOne returns null, insert called // findOne returns null, insert called // document gets inserted // findOne returns a gameCheck // document gets inserted

Sie sollten einen eindeutigen Index verwenden, um Duplikate zu verhindern. Dann könnten Ihre Knoteninstanzen den Einschub sofort optimistisch aufrufen und den Fehler einfach behandeln, wenn sie zu spät sind, was Ihrer Logik "Wenn gefunden, nichts zu tun" ähnlich ist.

Alternativ, wenn Sie das Dokument nichts dagegen jedes Mal aktualisiert werden, können Sie die Upsert Methode verwenden, die atomar ist:

db.collection.update(query, update, {upsert: true})

Siehe auch

MongoDB atomic "findOrCreate": findOne, insert if nonexistent, but do not update

Verwandte Themen