MongoDB - Insert wenn nicht vorhanden, sonst überspringen
Ist es möglich, Sie in Mongo mit Zustand;
//Pseudo code
Bulk Insert Item :
If Key exists
Skip, don't throw error
If key does not exist
Add item
Wenn ich einzelne Einsätze, es könnte einen Fehler zurück oder legen in die Sammlung, aber ist es möglich, in bulk ?
- Lesen Sie "upsert". Denn das ist, wie MongoDB, tut das. Es ist
.upsert()
als erforderlich Modifikator für bulk-Operationen. Auch$setOnInsert
gilt nur für änderungen, wenn ein neues Dokument "inserted" und nichts sonst, wenn die nur Operationen sind in diesem block.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie zwei echte Entscheidungen hier, je nachdem, wie Sie wollen, um Dinge zu handhaben:
Verwenden upsert Funktionalität von MongoDB im wesentlichen "lookup", wenn Sie die wichtigsten Daten vorhanden ist. Wenn nicht, dann werden Sie nur übergeben, Daten an
$setOnInsert
und das wird sich nicht berühren, sonst nichts.Verwenden Sie "Ungeordnete" - Operationen in der Masse. Die ganze Gruppe von updates auch dann weiter, wenn ein Fehler zurückgegeben wird, aber der error report(s) sind genau das, und alles, was nicht ein Fehler comitted.
Ganze Beispiel:
Beachten Sie, dass die "geänderten Aktion", in der aktuelle Treiber ist, dass das Ergebnis die Antwort auf
.execute()
wird Rückkehr ein Fehler-Objekt geworfen werden, wo frühere Versionen hatten das nicht so mit "Un-bestellt" - Operationen.Dies macht es zwingend notwendig, dass Sie Ihren code niemals verlässt sich auf die
err
allein zurück kam, und Sie sollte inpspeting die zurückgegebenresult
stattdessen für die vollständige Klassifizierung der Fehler.Dennoch, wenn ungeordnete dann die batch wird fortgesetzt, bis das Ende, egal, wie viele Fehler auftreten. Dinge, die nicht einen Fehler begangen werden, als normal.
Diese kommt wirklich darauf an, "ist die Reihenfolge wichtig". Wenn dem so ist, dann müssen Sie "Bestellt" operations und Sie können nur vermeiden, duplicate keys mit "upserts". Ansonsten verwenden Sie "ungeordnet", aber bewusst sein, die Fehler gibt und was Sie eigentlich bedeuten.
Auch, wenn mit
.collection
um die zugrunde liegende collection-Objekt aus der Basis-Treiber zu aktivieren "Bulk" - Operationen, dann immer sicher sein, dass entweder "einige" Mungo-Methode wurde immer als erste.Ohne, dass es gibt keine garantierte Verbindung zu der Datenbank mit den nativen Treiber Verfahren, wie es gehandhabt wird, für den Mungo Methoden, so schlägt die operation fehl, da keine Verbindung.
Die Alternative zu "feuern" Mungo Methode zuerst wickeln Sie Ihre app-Logik in einen Ereignis-listener für die Verbindung:
Wie bereits gesagt wurde, "einfügen", wenn es nicht bereits vorhanden ist" kann erreicht werden, indem die
update
- Befehl mit derupsert
- option auf true festgelegt. Hier ist, wie zu tun, dass mit der 3.x node.js Fahrer:Wenn die
filter
gibt null Ergebnisse, wird ein neues Dokument erstellt, mit den filter-Bedingungen und die$set
updates (wenn überhaupt). Wenn Sie$setOnInsert
, dann die updates werden nur angewendet, um neue docs.Posting dieses Beispiel, weil es gewesen wäre praktisch für meine situation. Mehr info in der Dokumentation für db.Sammlung.bulkWrite.