MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

L'instance Mongoose .save() ne fonctionne pas lorsque l'objet tableau intégré a été modifié

Le problème est que la mangouste ne sait pas que votre tableau est modifié.

Vous pouvez utiliser 2 solutions :

marquerModifié

Cette fonction marquera l'élément incorporé comme modifié et forcera sa ré-enregistrement. Il dira à Mangouste de ré-enregistrer cet élément.

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.'
          });
        });
})

Utilisez un schéma complet.

Pour éviter l'astuce markModified, vous devez décrire le contenu des cartes dans votre schéma. De cette façon, la mangouste pourra déterminer si elle doit enregistrer le champ ou non.

Voici comment bien déclarer votre schéma :

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 cette façon, la mangouste pourra détecter si une valeur à l'intérieur des cartes a changé et enregistrer uniquement l'élément modifié.

Si vous pouvez le faire (schéma statique), c'est clairement la bonne façon de le faire.