MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Екземплярът на Mongoose .save() не работи при промяна на обекта на вградения масив

Проблемът е, че mongoose не знае, че вашият масив е модифициран.

Можете да използвате 2 решения:

markModified

Тази функция ще маркира вградения елемент като модифициран и ще принуди повторното му запазване. Ще каже на mongoose да запази отново този елемент.

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

Използвайте пълна схема.

За да избегнете трика markModified, трябва да опишете съдържанието на картите във вашата схема. По този начин mongoose ще може да определи дали трябва да запази полето или не.

Ето как правилно да декларирате вашата схема:

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

По този начин mongoose ще може да открие дали стойността в картите се е променила и да запази само модифицирания елемент.

Ако можете да го направите (статична схема), това очевидно е добрият начин да го направите.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Топологията за хвърляне на Монго беше унищожена след една връзка

  2. как правилно да хвърляте ObjectId в mongoose

  3. използвайки $и с $match в mongodb

  4. Mongo Заявка за подполета

  5. MongoDB diacriticInSensitive търсене не показва всички редове с ударение (думи с диакритичен знак), както се очаква и обратно