MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wenn der Wert einer Eigenschaft beim Aktualisieren null ist, sollte diese Eigenschaft nicht zum Datensatz hinzugefügt werden

Ich würde das nicht so schreiben, aber ich werde Ihnen sagen, warum Ihr Code fehlschlägt.

Das Problem ist Ihr $set-Block

Sie entscheiden sich dafür, den Wert speziell auf das übergebene Aktualisierungsobjekt festzulegen. Wenn der Wert undefined ist Sie zwingen Mongo, das auf null zu setzen .

Hier ist das Problem

Beispiel in DB:

{
    "_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
    "name" : "firstTest",
    "nickname": "jack",
    "__v" : 0
}

WENN Sie testToUpdate = { name: 'foo' } übergeben Sie werden am Ende mit

 Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}

weil Sie updatedValues.nickname erhalten weg von den Argumenten und das ist nicht definiert

Was Sie wollen ist

Test.update({ ... }, { $set: updatedValues }

was übersetzt wird in

Test.update({ ... }, { $set: { name: 'foo' } }

Sie geben keinen Schlüssel mehr für den Spitznamen an und setzen ihn daher nicht auf undefined/null.

Ich würde ein Mongoose-Plugin verwenden und mir keine Gedanken darüber machen, die Felder manuell bis zu Ihrem Modell zu übergeben (siehe github.com/autolotto/mongoose-model-update )

  • Sie können die aktualisierbaren Felder definieren und dann einfach model.update(req.body) ausführen und sorgen Sie sich nicht darum
  • Auch wenn Sie das Plugin nicht verwenden möchten, können Sie einfach Test.findByIdAndUpdate(id, { name, nickname }, callback) ausführen