Mongoose findByIdAndUpdate nie zwraca poprawnego modelu

102

Mam problem, którego wcześniej nie widziałem z Mongoose findByIdAndUpdate, który nie zwraca prawidłowego modelu w wywołaniu zwrotnym.

Oto kod:

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

Oryginalny dokument w bazie danych wygląda następująco:

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

AktualizacjaObj wygląda następująco:

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

Model zwrócony z wywołania zwrotnego jest identyczny z modelem oryginalnym, a nie zaktualizowanymObj. Jeśli zapytam o bazę danych, została ona poprawnie zaktualizowana. Po prostu nie jest zwracany z bazy danych.

To wygląda na błąd „głupiego użytkownika”, ale nie widzę tego. Wszelkie pomysły mile widziane.

JonRed
źródło
1
To niesamowite miejsce. I przypomnienie, dlaczego muszę zachować zgodność wszystkich moich projektów na wersjach, ponieważ ten pakiet przechodził własne testy jednostkowe. Dziękuję Ci.
JonRed

Odpowiedzi:

299

W Mongoose 4.0 domyślna wartość newopcji findByIdAndUpdate(i findOneAndUpdate) została zmieniona na false(patrz # 2262 informacji o wydaniu ). Oznacza to, że musisz jawnie ustawić opcję truepobierania nowej wersji dokumentu po zastosowaniu aktualizacji:

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...
JohnnyHK
źródło
5
Zostałem również złapany przez zmiany wartości zwracanych przez metodę „create”. Pozdrawiam kolego, zagłosowałbym dwa razy za, gdybym mógł.
JonRed
4
Umieść także PR dla zaktualizowanych dokumentów dotyczących projektu mangusty, więc miejmy nadzieję, że nikogo to nie złapie.
JonRed
3
O rany, dziękuję @JohnnyHK. To mnie zrujnowało. Oczywiście, że chcę odzyskać nowy. Może bardziej spójne z API, ale niezupełnie ze zdrowym rozsądkiem ... jeśli coś zaktualizuję, chciałbym zobaczyć zmiany. Dzięki, mangusta ...
Peege151
21
Łał! Cóż za okropna decyzja! To jedyny punkt robienia wyszukiwania w pierwszej kolejności zamiast aktualizacji.
Adam Lockhart
9
Nie rozumiem, dlaczego ktoś wolałby mieć w odpowiedzi stary dokument zamiast nowego
emilioriosvz