sql >> Databáze >  >> NoSQL >> MongoDB

Instance Mongoose .save() nefunguje, když se objekt vloženého pole změnil

Problém je v tom, že mongoose neví, že je vaše pole změněno.

Můžete použít 2 řešení:

markModified

Tato funkce označí vložený prvek jako upravený a vynutí jeho opětovné uložení. Řekne mongoose, aby tento prvek znovu uložil.

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

Použít úplné schéma.

Abyste se vyhnuli triku markModified, měli byste popsat obsah karet ve vašem schématu. Tímto způsobem bude mongoose moci určit, zda potřebuje pole uložit nebo ne.

Zde je způsob, jak správně deklarovat své 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);

Tímto způsobem bude mangusta schopna zjistit, zda se hodnota uvnitř karet změnila, a uložit pouze upravenou položku.

Pokud to dokážete (statické schéma), je to jednoznačně dobrý způsob, jak to udělat.



  1. tar gzip mongo dump jako MySQL

  2. MongoDB:bezpodmínečné aktualizace?

  3. projekce nefunguje s vyhledávacím dotazem

  4. Existuje nějaký klient Redis (preferovaná Java), který podporuje transakce na clusteru Redis?