MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongoose-Instanz .save() funktioniert nicht, wenn sich das eingebettete Array-Objekt geändert hat

Das Problem ist, dass Mongoose nicht weiß, dass Ihr Array geändert wurde.

Sie können 2 Lösungen verwenden:

markModified

Diese Funktion markiert das eingebettete Element als geändert und erzwingt ein erneutes Speichern. Es weist Mongoose an, dieses Element erneut zu speichern.

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

Verwenden Sie ein vollständiges Schema.

Um den markModified-Trick zu vermeiden, sollten Sie den Inhalt von Karten in Ihrem Schema beschreiben. Auf diese Weise kann Mongoose feststellen, ob das Feld gespeichert werden muss oder nicht.

So deklarieren Sie Ihr Schema richtig:

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

Auf diese Weise kann Mungo erkennen, ob sich ein Wert in Karten geändert hat, und nur das geänderte Element speichern.

Wenn Sie es tun können (statisches Schema), ist dies eindeutig der gute Weg, es zu tun.