Mongoose findByIdAndUpdate non restituisce il modello corretto


99

Ho un problema che non ho visto prima con il findByIdAndUpdate di Mongoose che non restituisce il modello corretto nella richiamata.

Ecco il codice:

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

Il documento originale nel db ha questo aspetto:

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

L'aggiornamentoObj in corso assomiglia a questo:

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

Il modello restituito dalla richiamata è identico al modello originale, non aggiornatoObj. Se interrogo il db, è stato aggiornato correttamente. Semplicemente non viene restituito dal database.

Sembra un errore di "utente stupido", ma non riesco a vederlo. Tutte le idee notevolmente apprezzate.


1
Questo è un posto fantastico. E un promemoria del motivo per cui ho bisogno di mantenere tutti i miei progetti corrispondenti alle versioni, poiché quel pacchetto stava superando i propri test unitari. Grazie.
JonRed

Risposte:


294

In Mongoose 4.0, il valore predefinito per l' newopzione findByIdAndUpdate(e findOneAndUpdate) è stato modificato in false(vedere # 2262 delle note di rilascio ). Ciò significa che è necessario impostare esplicitamente l'opzione per trueottenere la nuova versione del documento, dopo l'applicazione dell'aggiornamento:

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

5
Inoltre è stato catturato dalle modifiche ai valori di ritorno del metodo "create". Ciao amico, voterei due volte se potessi.
JonRed

4
Metti anche un PR per i documenti aggiornati sul progetto mongoose, quindi spero che non catturi nessun altro.
JonRed

3
Oh ragazzo grazie @JohnnyHK. Questo mi ha distrutto. Ovviamente rivoglio il nuovo. Forse più coerente con l'API, ma non proprio con il buon senso ... se aggiorno qualcosa mi piacerebbe vedere le modifiche. Grazie mangusta ...
Peege151

21
Wow! Che decisione orribile hanno preso! Questo è l'unico punto di fare la ricerca in primo luogo invece di aggiornare.
Adam Lockhart

9
Non capisco perché qualcuno preferirebbe avere il vecchio documento nella risposta invece del nuovo
emilioriosvz
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.