sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Alguna forma de obtener el IDS modificado de las operaciones masivas de mongodb usando mongoose?

Bueno, desde un punto de vista, la respuesta es "no" y hay una muy buena razón para ello.

En términos generales, las operaciones de "actualización" de MongoDB están destinadas a funcionar en lo que comúnmente son documentos "múltiples", lo que significa lo que coincida con los criterios. Entonces, el caso general aquí es que cualquier cosa que haya solicitado que se actualice en singular o por selección se actualizó o no, dependiendo de si algo coincidió.

En el contexto "Masivo", se aplica gran parte de lo mismo, en el sentido de que hubo una coincidencia de criterios o no, en cuyo caso obtendrá valores devueltos para nMatched y nModified respectivamente, ya que también existe la posibilidad de que un documento "coincidente" no se actualice realmente cuando los datos presentes para modificar ya son el valor que es el objetivo de la modificación.

Esa última distinción entre nMatched y nModified es la razón principal por la que "no puede hacer esto de manera confiable" , ya que no necesariamente se modifica todo lo que coincide.

Sin embargo, puede hacer una estimación valor en el caso de discernir entre acciones "upsert" y "actualizaciones" reales. No será 100% preciso debido a la distinción anotada, pero el proceso básico es comparar su lista de entrada con el valor devuelto por getUpsertedIds() , que es una llamada válida.

Evitar la sintaxis de ES6 para el resto del mundo en la actualidad:

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
});

Donde el resultado devuelto por from .getUpsertedIds() es una matriz de objetos que contiene tanto la posición de "índice" de la actualización masiva como el _id generado o proporcionado valor de la "inserción".

[ { index: 0, _id: 1 } ]

Por lo tanto, haga coincidir su lista de entrada con la lista "alterada" para ver "lo que no está allí" , básicamente devuelve cosas que probablemente acaba de modificar Por supuesto, con la advertencia de que si el valor ya era el mismo que el de la modificación, entonces realmente no era una modificación en absoluto.

Pero debido a cómo debe funcionar la API, eso es lo más cerca que vas a estar.