Nou, vanuit één oogpunt is het antwoord "nee" en daar is een heel goede reden voor.
Over het algemeen zijn de "update" -bewerkingen van MongoDB bedoeld om te werken in wat gewoonlijk "meerdere" documenten zijn, wat betekent dat alles overeenkomt met de criteria. Dus het algemene geval hier is dat wat je ofwel vroeg om te worden bijgewerkt in het enkelvoud of door selectie, al dan niet werd bijgewerkt, afhankelijk van of er iets overeenkwam.
In de "Bulk"-context is veel van hetzelfde van toepassing, in die zin dat er al dan niet een criteriaovereenkomst was, in welk geval u geretourneerde waarden krijgt voor nMatched
en nModified
respectievelijk, aangezien er ook de mogelijkheid is dat een "gematcht" document niet daadwerkelijk wordt bijgewerkt wanneer de gegevens die aanwezig zijn om te worden gewijzigd al de waarde is die het doel van de wijziging is.
Dat laatste onderscheid tussen nMatched
en nModified
is de belangrijkste reden waarom "je dit niet op betrouwbare wijze kunt doen" , omdat niet alles wat overeenkomt, noodzakelijkerwijs wordt gewijzigd.
U kunt echter wel een guestimate maken waarde in het geval van onderscheid tussen "upsert"-acties en daadwerkelijke "updates". Het zal niet 100% nauwkeurig zijn vanwege het opgemerkte onderscheid, maar het basisproces is om uw invoerlijst te vergelijken met de geretourneerde waarde van getUpsertedIds()
, wat een geldige oproep is.
Op dit moment de ES6-syntaxis negeren voor de rest van de wereld:
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
});
Waar het geretourneerde resultaat van van .getUpsertedIds()
is een array van objecten die zowel de "index"-positie van de bulkupdate als de gegenereerde of geleverde _id
bevatten waarde van de "upsert".
[ { index: 0, _id: 1 } ]
Dus vergelijk uw invoerlijst met de "upserted" lijst om "wat er niet is" te zien , retourneert in feite dingen die waarschijnlijk zojuist gewijzigd. Met natuurlijk het voorbehoud dat als de waarde al hetzelfde was als de wijziging, het eigenlijk helemaal geen wijziging was.
Maar vanwege de manier waarop de API zou moeten werken, komt dat zo dicht mogelijk in de buurt.