No escribiría esto de esta manera, pero te diré por qué falla tu código.
El problema es tu bloque $set
Está eligiendo establecer específicamente el valor para el objeto de actualización pasado. Si el valor es undefined
estás obligando a mongo a establecer eso en null
.
Aquí está el problema
ejemplo, en DB:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
SI pasa testToUpdate = { name: 'foo' }
terminarás con
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
porque obtienes updatedValues.nickname
fuera de los argumentos y eso no está definido
Lo que quieres es
Test.update({ ... }, { $set: updatedValues }
que se traduce como
Test.update({ ... }, { $set: { name: 'foo' } }
Ya no proporciona una clave para el apodo, por lo que no se configura como indefinido/nulo.
Usaría un complemento de mongoose y no me preocuparía por pasar manualmente los campos hasta su modelo (consulte github.com/autolotto/mongoose-modelo-actualización )
- Puede definir los campos actualizables y luego puede hacer
model.update(req.body)
y no te preocupes por todo esto - Incluso si no quiere usar el complemento, puede hacer
Test.findByIdAndUpdate(id, { name, nickname }, callback)