Jeg ville ikke skrive dette på denne måde, men jeg vil fortælle dig, hvorfor din kode fejler.
Problemet er din $set blok
Du vælger specifikt at indstille værdien til opdateringsobjektet, der er sendt ind. Hvis værdien er undefined
du tvinger mongo til at sætte det til null
.
Her er problemet
eksempel i DB:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
HVIS du sender testToUpdate = { name: 'foo' }
du ender med
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
fordi du får updatedValues.nickname
ud af argumenterne og det er ikke defineret
Hvad du ønsker er
Test.update({ ... }, { $set: updatedValues }
som er oversat til
Test.update({ ... }, { $set: { name: 'foo' } }
Du angiver ikke længere en nøgle til kaldenavn, og gør det derfor ikke indstillet til undefined/null.
Jeg ville bruge et mongoose plugin og ikke bekymre mig om manuelt at sende felterne hele vejen til din model (se github.com/autolotto/mongoose-model-update )
- Du kan definere de felter, der kan opdateres, og derefter kan du bare gøre
model.update(req.body)
og ikke bekymre dig om alt dette - Selv hvis du ikke vil bruge pluginnet, kan du stadig bare gøre
Test.findByIdAndUpdate(id, { name, nickname }, callback)