Eu não escreveria desta forma, mas vou te dizer por que seu código está falhando.
O problema é o seu bloco $set
Você está escolhendo definir especificamente o valor para o objeto de atualização passado. Se o valor for
undefined
você está forçando o mongo a definir isso como null
. Aqui está o problema
exemplo, em DB:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
SE você passar em
testToUpdate = { name: 'foo' }
você vai acabar com Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
porque você está recebendo
updatedValues.nickname
fora dos argumentos e isso não está definido O que você quer é
Test.update({ ... }, { $set: updatedValues }
que é traduzido para
Test.update({ ... }, { $set: { name: 'foo' } }
Você não está mais fornecendo uma chave para o apelido, portanto, não o define como indefinido/nulo.
Eu usaria um plug-in do mangusto e não me preocuparia em passar manualmente os campos até o seu modelo (consulte github.com/autolotto/mongoose-model-update )
- Você pode definir os campos que podem ser atualizados e, em seguida, basta fazer
model.update(req.body)
e não se preocupe com tudo isso - Mesmo que você não queira usar o plugin, você ainda pode fazer
Test.findByIdAndUpdate(id, { name, nickname }, callback)