Fra et synspunkt er svaret "nej", og det er der en meget god grund til.
Generelt er MongoDB "opdaterings"-operationer beregnet til at fungere på tværs af, hvad der almindeligvis er "flere" dokumenter, hvilket betyder, hvad der end matchede kriterierne. Så det generelle tilfælde her er, hvad end du enten bad om at blive opdateret i enten ental eller ved valg enten blev opdateret eller ej, afhængigt af om noget blev matchet.
I "Bulk"-konteksten gælder meget af det samme, idet der enten var et kriteriematch eller ej, i hvilket tilfælde du vil få returnerede værdier for nMatched
og nModified
da der også er mulighed for, at et "matchet" dokument faktisk ikke opdateres, hvor de tilstedeværende data, der skal ændres, allerede er den værdi, som er målet for ændringen.
Den sidste skelnen mellem nMatched
og nModified
er den primære årsag til, at "du ikke kan gøre dette pålideligt" , da ikke alt matchet nødvendigvis er ændret.
Du kan dog lave et gæst værdi i tilfælde af at skelne mellem "upsert"-handlinger og faktiske "opdateringer". Den vil ikke være 100 % nøjagtig på grund af den noterede skelnen, men den grundlæggende proces er at sammenligne din inputliste med den returnerede værdi fra getUpsertedIds()
, hvilket er et gyldigt opkald.
Undgå ES6-syntaksen for resten af verden i øjeblikket:
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
});
Hvor det returnerede resultat fra .getUpsertedIds()
er en matrix af objekter, der indeholder både "indeks"-positionen fra masseopdateringen og den genererede eller leverede _id
værdien af "upsert".
[ { index: 0, _id: 1 } ]
Så match din inputliste mod den "opsatte" liste for at se "hvad er der ikke" , returnerer dybest set ting, der hvor sandsynligvis var lige ændret. Selvfølgelig med det forbehold, at hvis værdien allerede var den samme som modifikationen, så var det virkelig slet ikke en modifikation.
Men på grund af hvordan API'en er beregnet til at fungere, er det så tæt på, som du kommer.