Non lo scriverei in questo modo, ma ti dirò perché il tuo codice non riesce.
Il problema è il tuo $set block
Stai scegliendo di impostare in modo specifico il valore sull'oggetto di aggiornamento passato. Se il valore è undefined
stai costringendo mongo a impostarlo su null
.
Ecco il problema
esempio, in DB:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
SE passi testToUpdate = { name: 'foo' }
finirai con
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
perché stai ricevendo updatedValues.nickname
fuori degli argomenti e quello non è definito
Quello che vuoi è
Test.update({ ... }, { $set: updatedValues }
che viene tradotto in
Test.update({ ... }, { $set: { name: 'foo' } }
Non stai più fornendo una chiave per il nickname, quindi non impostandolo su undefined/null.
Userei un plugin mongoose e non mi preoccuperei di passare manualmente i campi fino al tuo modello (vedi github.com/autolotto/mongoose-model-update )
- Puoi definire i campi aggiornabili e quindi puoi semplicemente fare
model.update(req.body)
e non preoccuparti di tutto questo - Anche se non vuoi usare il plugin puoi comunque fare
Test.findByIdAndUpdate(id, { name, nickname }, callback)