समस्या यह है कि नेवला नहीं जानता कि आपकी सरणी संशोधित है।
आप 2 समाधानों का उपयोग कर सकते हैं:
चिह्नितसंशोधित
यह फ़ंक्शन एम्बेड किए गए तत्व को संशोधित के रूप में चिह्नित करेगा और इसे फिर से सहेजने के लिए बाध्य करेगा। यह नेवले को इस तत्व को फिर से सहेजने के लिए कहेगा।
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.'
});
});
})
पूर्ण स्कीमा का उपयोग करें।
मार्कमॉडिफाइड ट्रिक से बचने के लिए, आपको अपने स्कीमा में कार्ड की सामग्री का वर्णन करना चाहिए। इस तरह नेवला यह निर्धारित करने में सक्षम होगा कि उसे खेत को बचाने की जरूरत है या नहीं।
अपनी स्कीमा को ठीक से घोषित करने का तरीका यहां दिया गया है:
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);
इस तरह, नेवला यह पता लगाने में सक्षम होगा कि क्या कार्ड के अंदर एक मूल्य बदल गया है और केवल संशोधित आइटम को सहेजता है।
यदि आप इसे (स्थिर स्कीमा) कर सकते हैं, तो यह स्पष्ट रूप से इसे करने का अच्छा तरीका है।