MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Un moyen d'obtenir l'IDS modifié à partir des opérations en masse de mongodb à l'aide de mongoose ?

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.