MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Se il valore di una proprietà è nullo durante l'aggiornamento, tale proprietà non deve essere aggiunta al record

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)