MongoDB- Einfügen, wenn es nicht existiert, sonst überspringen

8

Ist es möglich, in Mongo mit Bedingung einfügen;

%Vor%

Wenn ich einzelne Einfügungen mache, wird möglicherweise ein Fehler zurückgegeben oder in die Sammlung eingefügt, aber ist das in Masse möglich?

    
Basit Anwer 07.09.2015, 02:40
quelle

1 Antwort

14

Sie haben hier zwei echte Möglichkeiten, je nachdem, wie Sie mit den Dingen umgehen wollen:

  1. Verwenden Sie im Wesentlichen die Funktionalität von MongoDB "Lookup", wenn die Schlüsseldaten vorhanden sind. Wenn nicht, dann geben Sie nur Daten an $setOnInsert weiter und das wird nichts anderes berühren.

  2. Verwenden Sie "Ungeordnete" Operationen in Massen. Der gesamte Batch von Updates wird fortgesetzt, auch wenn ein Fehler zurückgegeben wird, aber die Fehlerberichte sind genau das, und alles, was kein Fehler ist, wird eingefügt.

Ganzes Beispiel:

%Vor%

Beachten Sie, dass die "geänderte Aktion" in aktuellen Treibern lautet, dass die Ergebnisantwort auf .execute() ein Fehlerobjekt zurückgibt, das ausgelöst werden soll, während frühere Versionen dies nicht mit "Ungeordnet" getan haben "Operationen.

Dies macht es zwingend erforderlich, dass Ihr Code niemals auf die err zurückgreift, die allein zurückgegeben wird, und Sie sollten stattdessen die zurückgegebene result für die vollständige Klassifizierung von Fehlern einbinden.

Nichtsdestoweniger, wenn ungeordnet, dann wird der Stapel bis zum Ende fortgesetzt, egal wie viele Fehler auftreten. Dinge, die kein Fehler sind, werden wie üblich begangen.

Das kommt wirklich auf "Sequenz ist wichtig". Wenn dies der Fall ist, dann benötigen Sie "Ordered" -Operationen und Sie können nur doppelte Schlüssel vermeiden, indem Sie "upserts" verwenden. Verwenden Sie andernfalls "ungeordnet", aber beachten Sie die Fehlerrückgaben und was sie eigentlich bedeuten.

Wenn Sie .collection verwenden, um das zugrundeliegende Auflistungsobjekt aus dem Basistreiber zu holen, um "Bulk" -Operationen zu aktivieren, dann stellen Sie immer sicher, dass entweder "irgendeine" Mungo-Methode immer zuerst aufgerufen wurde.

Andernfalls gibt es keine garantierte Verbindung zur Datenbank mit den Methoden des nativen Treibers, da diese für die Mungo-Methoden behandelt werden, so dass der Vorgang aufgrund keiner Verbindung fehlschlägt.

Die Alternative, eine Mungo-Methode zuerst zu "feuern", besteht darin, die App-Logik in einen Ereignis-Listener für die Verbindung zu schreiben:

%Vor%     
Blakes Seven 07.09.2015, 03:38
quelle