Jag skulle inte skriva så här, men jag ska berätta varför din kod misslyckas.
Problemet är ditt $set-block
Du väljer att specifikt ställa in värdet för uppdateringsobjektet som skickas in. Om värdet är undefined
du tvingar mongo att ställa in det på null
.
Här är problemet
till exempel i DB:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
OM du skickar in testToUpdate = { name: 'foo' }
du kommer att sluta med
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
eftersom du får updatedValues.nickname
bort från argumenten och det är inte definierat
Vad du vill ha är
Test.update({ ... }, { $set: updatedValues }
som är översatt till
Test.update({ ... }, { $set: { name: 'foo' } }
Du tillhandahåller inte längre en nyckel för smeknamn, vilket gör det inte inställt på undefined/null.
Jag skulle använda ett mongoose-plugin och inte oroa mig för att manuellt skicka fälten hela vägen till din modell (se github.com/autolotto/mongoose-model-update )
- Du kan definiera de uppdateringsbara fälten och sedan kan du bara göra
model.update(req.body)
och oroa dig inte för allt detta - Även om du inte vill använda plugin-programmet kan du fortfarande göra
Test.findByIdAndUpdate(id, { name, nickname }, callback)