Проблемът е, че 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 ще може да открие дали стойността в картите се е променила и да запази само модифицирания елемент.
Ако можете да го направите (статична схема), това очевидно е добрият начин да го направите.