Cóż, z jednego punktu widzenia odpowiedź brzmi „nie” i jest ku temu bardzo dobry powód.
Ogólnie rzecz biorąc, operacje „aktualizacji” MongoDB są przeznaczone do pracy na tym, co zwykle jest „wieloma” dokumentami, a zatem oznacza to, co spełnia kryteria. Tak więc ogólny przypadek dotyczy tego, o co prosiłeś o aktualizację w liczbie pojedynczej lub przez wybór, albo zostało zaktualizowane, albo nie, w zależności od tego, czy coś zostało dopasowane.
W kontekście „Zbiorczym” obowiązuje w dużej mierze ta sama rzecz, w której kryteria były zgodne lub nie, w którym to przypadku otrzymasz zwrócone wartości dla nMatched
i nModified
odpowiednio, ponieważ istnieje również możliwość, że „dopasowany” dokument nie jest faktycznie aktualizowany, gdy obecne dane do modyfikacji są już wartością, która jest celem modyfikacji.
To ostatnie rozróżnienie między nMatched
i nModified
to główny powód, dla którego „nie możesz tego zrobić niezawodnie” , ponieważ nie wszystko, co jest dopasowane, jest koniecznie modyfikowane.
Możesz jednak zrobić gościnnie wartość w przypadku rozróżnienia między działaniami „upsert” a rzeczywistymi „aktualizacjami”. Nie będzie to w 100% dokładne ze względu na odnotowane rozróżnienie, ale podstawowym procesem jest porównanie twojej listy wejściowej z wartością zwróconą z getUpsertedIds()
, który jest prawidłowym wywołaniem.
Obecnie unikamy składni ES6 dla reszty świata:
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
});
Gdzie zwrócony wynik z .getUpsertedIds()
to tablica obiektów zawierająca zarówno pozycję „indeks” z aktualizacji zbiorczej, jak i wygenerowany lub dostarczony _id
wartość "upsert".
[ { index: 0, _id: 1 } ]
Dopasuj więc swoją listę danych wejściowych do listy „przesuniętych”, aby zobaczyć „czego tam nie ma” , zasadniczo zwraca rzeczy, które prawdopodobnie właśnie zmodyfikowany. Oczywiście z zastrzeżeniem, że jeśli wartość była już taka sama jak modyfikacja, to tak naprawdę nie była to w ogóle modyfikacja.
Ale ze względu na sposób, w jaki interfejs API ma działać, jest to tak blisko, jak to tylko możliwe.