Je n'écrirais pas cela de cette façon, mais je vais vous dire pourquoi votre code échoue.
Le problème est votre bloc $set
Vous choisissez de définir spécifiquement la valeur sur l'objet de mise à jour transmis. Si la valeur est undefined
vous forcez mongo à le définir sur null
.
Voici le problème
exemple, dans la BD :
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
SI vous transmettez testToUpdate = { name: 'foo' }
vous vous retrouverez avec
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
parce que vous obtenez updatedValues.nickname
hors des arguments et ce n'est pas défini
Ce que vous voulez est
Test.update({ ... }, { $set: updatedValues }
qui est traduit en
Test.update({ ... }, { $set: { name: 'foo' } }
Vous ne fournissez plus de clé pour le pseudonyme, vous ne le définissez donc pas sur undefined/null.
J'utiliserais un plugin mongoose et je ne m'inquiéterais pas de passer manuellement les champs jusqu'à votre modèle (voir github.com/autolotto/mongoose-model-update )
- Vous pouvez définir les champs modifiables, puis vous pouvez simplement faire
model.update(req.body)
et ne vous inquiétez pas de tout cela - Même si vous ne voulez pas utiliser le plugin, vous pouvez toujours faire
Test.findByIdAndUpdate(id, { name, nickname }, callback)