Nepsal bych to tímto způsobem, ale řeknu vám, proč váš kód selhává.
Problém je ve vašem $set block
Rozhodli jste se konkrétně nastavit hodnotu předávanému objektu aktualizace. Pokud je hodnota undefined
nutíte mongo, aby to nastavil na null
.
Zde je problém
například v DB:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
POKUD zadáte testToUpdate = { name: 'foo' }
skončíte s
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
protože získáváte updatedValues.nickname
mimo argumenty a to není definováno
Co chcete je
Test.update({ ... }, { $set: updatedValues }
což je přeloženo do
Test.update({ ... }, { $set: { name: 'foo' } }
Již neposkytujete klíč pro přezdívku, takže ji nenastavíte na undefined/null.
Použil bych plugin mongoose a nestaral bych se o ruční předávání polí až k vašemu modelu (viz github.com/autolotto/mongoose-model-update )
- Můžete definovat pole s možností aktualizace a poté stačí provést
model.update(req.body)
a nestarejte se o to všechno - I když plugin nechcete používat, stále můžete provést
Test.findByIdAndUpdate(id, { name, nickname }, callback)