Vấn đề là mongoose không biết mảng của bạn bị sửa đổi.
Bạn có thể sử dụng 2 giải pháp:
markModified
Chức năng này sẽ đánh dấu phần tử nhúng là đã sửa đổi và buộc lưu lại phần tử đó. Nó sẽ yêu cầu mongoose lưu lại phần tử này.
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.'
});
});
})
Sử dụng một lược đồ đầy đủ.
Để tránh thủ thuật markModified, bạn nên mô tả nội dung của các thẻ trong lược đồ của mình. Bằng cách này, mongoose sẽ có thể xác định xem nó có cần lưu trường hay không.
Đây là cách để khai báo lược đồ của bạn đúng cách:
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);
Bằng cách này, mongoose sẽ có thể phát hiện xem giá trị bên trong thẻ có thay đổi hay không và chỉ lưu mục đã sửa đổi.
Nếu bạn có thể làm điều đó (lược đồ tĩnh), đây rõ ràng là cách tốt để làm điều đó.