Ich würde das nicht so schreiben, aber ich werde Ihnen sagen, warum Ihr Code fehlschlägt.
Das Problem ist Ihr $set-Block
Sie entscheiden sich dafür, den Wert speziell auf das übergebene Aktualisierungsobjekt festzulegen. Wenn der Wert undefined
ist Sie zwingen Mongo, das auf null
zu setzen .
Hier ist das Problem
Beispiel in DB:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
WENN Sie testToUpdate = { name: 'foo' }
übergeben Sie werden am Ende mit
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
weil Sie updatedValues.nickname
erhalten weg von den Argumenten und das ist nicht definiert
Was Sie wollen ist
Test.update({ ... }, { $set: updatedValues }
was übersetzt wird in
Test.update({ ... }, { $set: { name: 'foo' } }
Sie geben keinen Schlüssel mehr für den Spitznamen an und setzen ihn daher nicht auf undefined/null.
Ich würde ein Mongoose-Plugin verwenden und mir keine Gedanken darüber machen, die Felder manuell bis zu Ihrem Modell zu übergeben (siehe github.com/autolotto/mongoose-model-update )
- Sie können die aktualisierbaren Felder definieren und dann einfach
model.update(req.body)
ausführen und sorgen Sie sich nicht darum - Auch wenn Sie das Plugin nicht verwenden möchten, können Sie einfach
Test.findByIdAndUpdate(id, { name, nickname }, callback)
ausführen