Eh bien, d'un certain point de vue, la réponse est "non" et il y a une très bonne raison à cela.
De manière générale, les opérations de "mise à jour" de MongoDB sont destinées à fonctionner sur ce qui est généralement "plusieurs" documents, c'est-à-dire tout ce qui correspond aux critères. Donc, le cas général ici est que tout ce que vous avez demandé à mettre à jour au singulier ou par sélection a été mis à jour ou non selon que quelque chose a été mis en correspondance.
Dans le contexte "Bulk", une grande partie de la même chose s'applique, en ce sens qu'il y avait une correspondance de critères ou non, auquel cas vous obtiendrez des valeurs renvoyées pour nMatched
et nModified
respectivement, car il y a aussi la possibilité qu'un document "correspondant" ne soit pas réellement mis à jour où la donnée présente à modifier est déjà la valeur qui est la cible de la modification.
Cette dernière distinction entre nMatched
et nModified
est la principale raison pour laquelle "vous ne pouvez pas faire cela de manière fiable" , puisque tout ce qui correspond n'est pas nécessairement modifié.
Vous pouvez cependant faire une estimation valeur dans le cas du discernement entre les actions "upsert" et les "mises à jour" réelles. Il ne sera pas précis à 100 % en raison de la distinction notée, mais le processus de base consiste à comparer votre liste d'entrée à la valeur renvoyée par getUpsertedIds()
, qui est un appel valide.
Évitant la syntaxe ES6 pour le reste du monde à l'heure actuelle :
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
});
Où le résultat renvoyé de .getUpsertedIds()
est un tableau d'objets contenant à la fois la position "index" de la mise à jour en masse et le _id
généré ou fourni valeur du "upsert".
[ { index: 0, _id: 1 } ]
Donc, comparez votre liste d'entrée avec la liste "mise à jour" pour voir "ce qui n'est pas là" , renvoie essentiellement des choses qui étaient probablement juste modifié. Avec bien sûr la mise en garde que si la valeur était déjà la même que la modification, alors ce n'était vraiment pas du tout une modification.
Mais en raison de la façon dont l'API est censée fonctionner, c'est aussi proche que possible.