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

Mongoose-forekomsten .save() virker ikke, når det indlejrede array-objekt blev ændret

Problemet er, at mongoose ikke ved, at dit array er ændret.

Du kan bruge 2 løsninger :

markModified

Denne funktion vil markere det indlejrede element som ændret og fremtvinge en genlagring af det. Det vil bede mongoose om at gemme dette element igen.

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

Brug et komplet skema.

For at undgå markModified-tricket bør du beskrive indholdet af kort i dit skema. På denne måde vil mongoose være i stand til at afgøre, om den skal gemme feltet eller ej.

Her er måden at erklære dit skema korrekt på:

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

På denne måde vil mongoose være i stand til at opdage, om en værdi i kortene ændres, og kun gemme det ændrede element.

Hvis du kan gøre det (statisk skema), er dette klart den gode måde at gøre det på.



  1. Mongodb 1to1 relation mellem underdokumenter

  2. spring data mongodb _id mapping præference

  3. MongoDB Aggregation:Tilføj felt fra et indlejret dokument via en dynamisk feltsti

  4. MongoDB - Opdater et dokument