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

A instância do Mongoose .save() não funciona quando o objeto de matriz incorporado é alterado


O problema é que o mangusto não sabe que seu array foi modificado.

Você pode usar 2 soluções:

marcaModificada


Esta função marcará o elemento incorporado como modificado e forçará um novo salvamento dele. Ele dirá ao mongoose para salvar novamente 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.'
          });
        });
})

Use um esquema completo.


Para evitar o truque markModified, você deve descrever o conteúdo dos cartões em seu esquema. Dessa forma, o mangusto poderá determinar se precisa salvar o campo ou não.

Aqui está a maneira de declarar seu esquema corretamente:
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);

Dessa forma, o mangusto poderá detectar se um valor dentro das cartas foi alterado e salvar apenas o item modificado.

Se você pode fazer isso (esquema estático), essa é claramente a boa maneira de fazê-lo.