Mongoose findByIdAndUpdate no devuelve el modelo correcto


99

Tengo un problema que no había visto antes con Mongoose findByIdAndUpdate que no devuelve el modelo correcto en la devolución de llamada.

Aquí está el código:

    var id = args._id;
    var updateObj = {updatedDate: Date.now()};
    _.extend(updateObj, args);

    Model.findByIdAndUpdate(id, updateObj, function(err, model) {
        if (err) {
            logger.error(modelString +':edit' + modelString +' - ' + err.message);
            self.emit('item:failure', 'Failed to edit ' + modelString);
            return;
        }
        self.emit('item:success', model);
    });

El documento original en la base de datos se ve así:

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 1'
}

El updateObj que entra se ve así:

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 2'
}  

El modelo devuelto por la devolución de llamada es idéntico al modelo original, no al updatedObj. Si consulto la base de datos, se ha actualizado correctamente. Simplemente no se devuelve de la base de datos.

Esto se siente como un error de 'usuario estúpido', pero no puedo verlo. Cualquier idea muy apreciada.


1
Ese es un lugar asombroso. Y un recordatorio de por qué necesito mantener todos mis proyectos coincidentes con las versiones, ya que ese paquete estaba pasando sus propias pruebas unitarias. Gracias.
JonRed

Respuestas:


295

En Mongoose 4.0, el valor predeterminado para la newopción de findByIdAndUpdate(y findOneAndUpdate) ha cambiado a false(consulte el número 2262 de las notas de la versión ). Esto significa que debe establecer explícitamente la opción para trueobtener la nueva versión del documento, después de que se aplique la actualización:

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...

5
También quedó atrapado por los cambios en los valores de retorno del método 'crear'. Saludos amigo, votaría a favor dos veces si pudiera.
JonRed

4
También ponga un PR para los documentos actualizados sobre el proyecto de la mangosta, por lo que es de esperar que no atrape a nadie más.
JonRed

3
Oh chico, gracias @JohnnyHK. Esto me destrozó. Por supuesto que quiero el nuevo de vuelta. Tal vez sea más consistente con la API, pero no realmente con sentido común ... si actualizo algo, me gustaría ver los cambios. Gracias mangosta ...
Peege151

21
¡Guauu! ¡Qué decisión tan horrible tomaron! Ese es el único punto de hacer la búsqueda en primer lugar en lugar de actualizar.
Adam Lockhart

9
No entiendo por qué alguien preferiría tener el documento antiguo en la respuesta en lugar del nuevo
emilioriosvz
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.