Masalahnya adalah luwak tidak tahu bahwa array Anda dimodifikasi.
Anda dapat menggunakan 2 solusi :
markModified
Fungsi ini akan menandai elemen yang disematkan sebagai dimodifikasi dan memaksa penyimpanan ulang. Ini akan memberi tahu luwak untuk menyimpan ulang elemen ini.
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.'
});
});
})
Gunakan skema lengkap.
Untuk menghindari trik markModified, Anda harus menjelaskan isi kartu dalam skema Anda. Dengan cara ini luwak akan dapat menentukan apakah perlu menyimpan bidangnya atau tidak.
Berikut cara mendeklarasikan skema dengan benar :
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);
Dengan cara ini, luwak akan dapat mendeteksi jika nilai di dalam kartu berubah dan hanya menyimpan item yang dimodifikasi.
Jika Anda dapat melakukannya (skema statis), ini jelas merupakan cara yang baik untuk melakukannya.