MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Se o valor de uma propriedade for nulo ao atualizar, essa propriedade não deve ser adicionada ao registro


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)