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

La instancia de Mongoose .save () no funciona cuando el objeto de matriz incrustado cambió

El problema es que la mangosta no sabe que su matriz está modificada.

Puedes usar 2 soluciones:

marcarModificado

Esta función marcará el elemento incrustado como modificado y obligará a volver a guardarlo. Le dirá a mongoose que vuelva a guardar este elemento.

User.findById(userID).exec(function (err, doc) {
        let cardInfo = req.cardInfo
        let cardIndex = req.cardIndex
        doc["cards"][0] = cardInfo;
        console.log(doc)
/*  here I got right doc object as I requested
{
        "_id": "59f3bdd488f912234fcf06ab",
        "email": "[email protected]",
        "username": "test",
        "__v": 2,
        "cards": [
            {
                "testNo": "42424242424242"
            }
        ]
    }
*/
        doc.markModified('cards');
        doc.save(function (err) {
          if (err) {
            return res.json({
              success: false,
              msg: 'Card add error'
            });
          }
          res.json({
            success: true,
            msg: 'Successful updated card.'
          });
        });
})

Utilice un esquema completo.

Para evitar el truco de markModified, debe describir el contenido de las tarjetas en su esquema. De esta forma, mongoose podrá determinar si necesita guardar el campo o no.

Esta es la forma de declarar su esquema correctamente:

const CardSchema = new Schema({
  testNo: String,
});

var UserSchema = new Schema({
    username: {
        type: String,
        unique: true,
        required: true
    },
    email: {
        type: String,
        unique: true,
        required: true
    },
    cards: [CardSchema]
});
module.exports = mongoose.model('User', UserSchema);

De esta manera, mongoose podrá detectar si un valor dentro de las tarjetas cambió y guardar solo el elemento modificado.

Si puede hacerlo (esquema estático), esta es claramente la buena forma de hacerlo.