Nie napisałbym tego w ten sposób, ale powiem Ci, dlaczego Twój kod zawodzi.
Problemem jest twój $set block
Wybierasz konkretnie ustawienie wartości przekazanego obiektu aktualizacji. Jeśli wartość jest undefined
zmuszasz mongo do ustawienia tego na null
.
Oto problem
na przykład w DB:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
JEŚLI zdasz w testToUpdate = { name: 'foo' }
skończysz z
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
ponieważ otrzymujesz updatedValues.nickname
poza argumentami i to nie jest zdefiniowane
Czego chcesz jest
Test.update({ ... }, { $set: updatedValues }
który jest tłumaczony na
Test.update({ ... }, { $set: { name: 'foo' } }
Nie dostarczasz już klucza dla pseudonimu, dlatego nie ustawiasz go na undefined/null.
Użyłbym wtyczki mongoose i nie martwię się o ręczne przekazywanie pól aż do twojego modelu (patrz github.com/autolotto/mongoose-model-update )
- Możesz zdefiniować pola, które można aktualizować, a następnie możesz po prostu wykonać
model.update(req.body)
i nie martw się tym wszystkim - Nawet jeśli nie chcesz używać wtyczki, nadal możesz po prostu wykonać
Test.findByIdAndUpdate(id, { name, nickname }, callback)