MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

L'istanza di Mongoose .save() non funziona quando l'oggetto array incorporato è stato modificato

Il problema è che la mangusta non sa che il tuo array è stato modificato.

Puoi utilizzare 2 soluzioni :

markModified

Questa funzione contrassegnerà l'elemento incorporato come modificato e ne forzerà un nuovo salvataggio. Dirà a Mongoose di salvare nuovamente questo 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.'
          });
        });
})

Utilizza uno schema completo.

Per evitare il trucco markModified, dovresti descrivere il contenuto delle carte nel tuo schema. In questo modo la mangusta sarà in grado di determinare se deve salvare il campo o meno.

Ecco il modo per dichiarare correttamente il tuo schema:

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);

In questo modo, la mangusta sarà in grado di rilevare se un valore all'interno delle carte è cambiato e salvare solo l'oggetto modificato.

Se puoi farlo (schema statico), questo è chiaramente il modo migliore per farlo.