Tja ur en synvinkel är svaret "nej" och det finns en mycket god anledning till det.
Generellt sett är MongoDB "uppdaterings"-operationer avsedda att fungera över vad som vanligtvis är "flera" dokument, vilket betyder vad som än matchar kriterierna. Så det allmänna fallet här är vad du än bad om att uppdateras i antingen singular eller genom att urvalet antingen uppdaterades eller inte, beroende på om något matchades.
I "Mass"-sammanhang gäller mycket av samma sak, i det att det antingen fanns en kriteriematchning eller inte, i vilket fall du får returnerade värden för nMatched
och nModified
eftersom det också finns möjligheten att ett "matchat" dokument faktiskt inte uppdateras där de data som finns som ska modifieras redan är det värde som är målet för modifieringen.
Den sista skillnaden mellan nMatched
och nModified
är den främsta anledningen till att "du inte kan göra detta på ett tillförlitligt sätt" , eftersom inte allt som matchas nödvändigtvis modifieras.
Du kan dock göra en gäst värde i fallet med att skilja mellan "upsert"-åtgärder och faktiska "uppdateringar". Det kommer inte att vara 100 % korrekt på grund av den noterade skillnaden, men den grundläggande processen är att jämföra din indatalista med det returnerade värdet från getUpsertedIds()
, vilket är ett giltigt samtal.
Undviker ES6-syntaxen för resten av världen för närvarande:
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
});
Där det returnerade resultatet från .getUpsertedIds()
är en array av objekt som innehåller både "index"-positionen från massuppdateringen och den genererade eller tillhandahållna _id
värdet för "upsert".
[ { index: 0, _id: 1 } ]
Så matcha din inmatningslista mot den "uppskjutna" listan för att se "vad som inte finns där" , returnerar i princip saker som förmodligen var just modifierad. Naturligtvis med förbehållet att om värdet redan var detsamma som ändringen, så var det verkligen inte en ändring alls.
Men på grund av hur API:et är tänkt att fungera är det så nära du kommer.