Problemet är att mongoose inte vet att din array är modifierad.
Du kan använda 2 lösningar:
markModified
Denna funktion kommer att markera det inbäddade elementet som modifierat och tvinga fram en återlagring av det. Det kommer att säga åt mongoose att spara om detta element.
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.'
});
});
})
Använd ett fullständigt schema.
För att undvika tricket markModified bör du beskriva innehållet på korten i ditt schema. På så sätt kommer mongoose att kunna avgöra om den behöver spara fältet eller inte.
Här är sättet att deklarera ditt schema korrekt :
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);
På detta sätt kommer mongoose att kunna upptäcka om ett värde på korten ändras och bara spara det ändrade föremålet.
Om du kan göra det (statiskt schema) är detta helt klart det bra sättet att göra det.