Nun, von einem Standpunkt aus lautet die Antwort "nein", und dafür gibt es einen sehr guten Grund.
Im Allgemeinen sollen „Aktualisierungs“-Vorgänge von MongoDB über „mehrere“ Dokumente hinweg funktionieren, was bedeutet, was auch immer den Kriterien entspricht. Der allgemeine Fall hier ist also, was auch immer Sie entweder im Singular aktualisiert haben oder durch Auswahl entweder aktualisiert wurden oder nicht, je nachdem, ob etwas gefunden wurde.
Im „Bulk“-Kontext gilt im Großen und Ganzen dasselbe, da es entweder eine Kriterienübereinstimmung gab oder nicht, in welchem Fall Sie Werte für nMatched
zurückerhalten und nModified
da auch die Möglichkeit besteht, dass ein „abgeglichenes“ Dokument nicht wirklich aktualisiert wird, wenn die zu ändernden Daten bereits der Wert sind, der das Ziel der Änderung ist.
Die letzte Unterscheidung zwischen nMatched
und nModified
ist der Hauptgrund, warum "Sie dies nicht zuverlässig tun können" , da nicht alles passende auch modifiziert werden muss.
Sie können jedoch eine Schätzung erstellen Wert bei der Unterscheidung zwischen "Upsert"-Aktionen und tatsächlichen "Updates". Aufgrund der angegebenen Unterscheidung wird es nicht 100 % genau sein, aber der grundlegende Prozess besteht darin, Ihre Eingabeliste mit dem zurückgegebenen Wert von getUpsertedIds()
zu vergleichen , was ein gültiger Aufruf ist.
Verzichtet derzeit auf die ES6-Syntax für den Rest der Welt:
var upserted = result.getUpsertedIds(); // get this from the bulk result
upserted = upserted.map(function(up) { return up._id }); // filter out just the _id values
var modifiedIds = edges.map(function(edge) { // get _id only from source
return edge.id;
}).filter(function(edge) {
return upserted.indexOf(edge) == -1; // and return only non upserted
});
Wobei das zurückgegebene Ergebnis von .getUpsertedIds()
ist ein Array von Objekten, das sowohl die "Index"-Position aus der Massenaktualisierung als auch die generierte oder bereitgestellte _id
enthält Wert des "Upsert".
[ { index: 0, _id: 1 } ]
Vergleichen Sie also Ihre Eingabeliste mit der "Upserted"-Liste, um "was nicht da ist" zu sehen , gibt im Grunde Dinge zurück, die wahrscheinlich waren gerade modifiziert. Natürlich mit der Einschränkung, dass, wenn der Wert bereits derselbe wie die Modifikation war, es wirklich überhaupt keine Modifikation war.
Aber aufgrund der Funktionsweise der API ist das so nah wie möglich.