Tengo 2 objetos diferentes dentro de una matriz, y quiero usar esos objetos para actualizar una colección en mi mongodb. Así que pensé en usar algo como esto:
for (i = 0 ; i < array.length ; i++) { Model.update({array[i]._id},{$set : {'credits_pending' : array[i].credits_pending}},false,true) }Pero solo actualiza el primer valor de mi matriz, es decir, matriz[0]
¿Por qué?
Por un lado, la actualización (y la mayoría de las demás operaciones) en Mongoose es asíncrona, por lo que debe esperar hasta que finalice la operación antes de continuar. Por lo general, es mejor hacer una operación a la vez en la misma colección. Con el ciclo for , está ejecutando dos operaciones asincrónicas al mismo tiempo en la misma colección, lo que podría generar un comportamiento no deseado.
En segundo lugar, creo que sus argumentos Model.update() están un poco fuera de lugar.
Me gusta usar async.js cuando trabajo con Mongoose, así que a continuación hay un ejemplo de cómo puede actualizar una matriz de objetos uno a la vez.
var async = require('async'); async.eachSeries(array, function updateObject (obj, done) { // Model.update(condition, doc, callback) Model.update({ _id: obj._id }, { $set : { credits_pending: obj.credits_pending }}, done); }, function allDone (err) { // this will be called when all the updates are done or an error occurred during the iteration });No sé cómo se ve su esquema, pero si esa es la única forma de hacerlo, intente algo como:
//array - your original array async.eachSeries(array, function(rec, callback) { updateRecord(rec._id, rec.credits_pending) .then((updated) => { callback(); }) }, function(err){ //execution comes here when array is fully iterated. }); function updateRecord(id, credits) { return Model.update({array[i]._id},{$set : {'credits_pending' : array[i].credits_pending}}); } Mongoose respalda internamente la promesa para que no tenga que preocuparse por nada más.
"Nota": para actualizar varios documentos, debe seleccionar alguna propiedad que sea común a todos los documentos. Este enfoque no es correcto y debe diseñar su esquema para evitar tales escenarios. Esta respuesta es en caso de que no tenga otra opción.