Не бих написал това по този начин, но ще ви кажа защо вашият код е неуспешен.
Проблемът е вашият $set блок
Вие избирате конкретно да зададете стойността на обекта за актуализация, който е предаден. Ако стойността е undefined
вие принуждавате mongo да зададе това на null
.
Ето го проблемът
например в DB:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
АКО подадете testToUpdate = { name: 'foo' }
ще завършите с
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
защото получавате updatedValues.nickname
извън аргументите и това не е дефинирано
Това, което искатете е
Test.update({ ... }, { $set: updatedValues }
което се превежда на
Test.update({ ... }, { $set: { name: 'foo' } }
Вече не предоставяте ключ за псевдоним, като по този начин не го настройвате на undefined/null.
Бих използвал приставка за mongoose и няма да се тревожа за ръчно предаване на полетата до вашия модел (вижте github.com/autolotto/mongoose-model-update )
- Можете да дефинирате полетата с възможност за актуализиране и след това можете просто да направите
model.update(req.body)
и не се тревожете за всичко това - Дори и да не искате да използвате приставката, пак можете просто да направите
Test.findByIdAndUpdate(id, { name, nickname }, callback)