MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Si la valeur d'une propriété est nulle lors de la mise à jour, cette propriété ne doit pas être ajoutée à l'enregistrement

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)