Problém je v tom, že mongoose neví, že je vaše pole změněno.
Můžete použít 2 řešení:
markModified
Tato funkce označí vložený prvek jako upravený a vynutí jeho opětovné uložení. Řekne mongoose, aby tento prvek znovu uložil.
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.'
});
});
})
Použít úplné schéma.
Abyste se vyhnuli triku markModified, měli byste popsat obsah karet ve vašem schématu. Tímto způsobem bude mongoose moci určit, zda potřebuje pole uložit nebo ne.
Zde je způsob, jak správně deklarovat své schéma:
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);
Tímto způsobem bude mangusta schopna zjistit, zda se hodnota uvnitř karet změnila, a uložit pouze upravenou položku.
Pokud to dokážete (statické schéma), je to jednoznačně dobrý způsob, jak to udělat.