Mungo findByIdAndUpdate gibt nicht das richtige Modell zurück


97

Ich habe ein Problem, das ich zuvor noch nicht gesehen habe, dass das Mongoose findByIdAndUpdate im Rückruf nicht das richtige Modell zurückgibt.

Hier ist der Code:

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

Das Originaldokument in der Datenbank sieht folgendermaßen aus:

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

Das UpdateObj sieht folgendermaßen aus:

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

Das vom Rückruf zurückgegebene Modell ist identisch mit dem ursprünglichen Modell, nicht mit dem aktualisiertenObj. Wenn ich die Datenbank abfrage, wurde sie korrekt aktualisiert. Es wird einfach nicht aus der Datenbank zurückgegeben.

Dies fühlt sich wie ein "dummer Benutzer" -Fehler an, aber ich kann ihn nicht sehen. Irgendwelche Ideen sehr geschätzt.


1
Das ist ein großartiger Ort. Und eine Erinnerung, warum ich alle meine Projekte auf Versionen abgleichen muss, da dieses Paket seine eigenen Komponententests bestanden hat. Danke dir.
JonRed

Antworten:


289

In Mongoose 4.0 wurde der Standardwert für die newOption findByIdAndUpdate(und findOneAndUpdate) in geändert false(siehe # 2262 der Versionshinweise ). Dies bedeutet, dass Sie die Option explizit festlegen müssen true, um die neue Version des Dokuments abzurufen, nachdem das Update angewendet wurde:

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

4
Wurde auch von den Änderungen an den Rückgabewerten der Methode 'create' überrascht. Prost Kumpel, ich würde zweimal abstimmen, wenn ich könnte.
JonRed

4
Fügen Sie auch eine PR für aktualisierte Dokumente zum Mungo-Projekt ein, damit hoffentlich niemand anderes auffällt.
JonRed

3
Oh Mann, danke @JohnnyHK. Das hat mich ruiniert. Natürlich will ich den neuen zurück. Vielleicht konsistenter mit der API, aber nicht wirklich mit gesundem Menschenverstand ... Wenn ich etwas aktualisiere, möchte ich die Änderungen sehen. Danke Mungo ...
Peege151

20
Beeindruckend! Was für eine schreckliche Entscheidung sie getroffen haben! Dies ist der einzige Punkt, an dem die Suche überhaupt erst durchgeführt wird, anstatt sie zu aktualisieren.
Adam Lockhart

9
Ich verstehe nicht, warum jemand lieber das alte Dokument in der Antwort haben möchte als das neue
emilioriosvz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.