Het probleem is dat mangoesten niet weten dat je array is aangepast.
U kunt 2 oplossingen gebruiken:
markModified
Deze functie markeert het ingesloten element als gewijzigd en dwingt het opnieuw op te slaan. Het zal mangoest vertellen om dit element opnieuw op te slaan.
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.'
});
});
})
Gebruik een volledig schema.
Om de markModified-truc te vermijden, moet je de inhoud van kaarten in je schema beschrijven. Op deze manier kan mangoest bepalen of het veld moet worden opgeslagen of niet.
Dit is de manier om uw schema correct te declareren:
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);
Op deze manier kan mangoest detecteren of een waarde in kaarten is gewijzigd en alleen het gewijzigde item opslaan.
Als je het kunt doen (statisch schema), is dit duidelijk de goede manier om het te doen.