sql >> Base de Datos >  >> NoSQL >> MongoDB

Si el valor de una propiedad es nulo al actualizar, esa propiedad no debe agregarse al registro

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)