問題は、マングースがアレイが変更されていることを認識していないことです。
2つのソリューションを使用できます:
markModified
この関数 埋め込まれた要素を変更済みとしてマークし、強制的に再保存します。マングースにこの要素を再保存するように指示します。
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.'
});
});
})
完全なスキーマを使用します。
markModifiedのトリックを回避するには、スキーマ内のカードの内容を記述する必要があります。このようにして、マングースはフィールドを保存する必要があるかどうかを判断できます。
スキーマを適切に宣言する方法は次のとおりです:
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);
このようにして、マングースはカード内の値が変更されたかどうかを検出し、変更されたアイテムのみを保存することができます。
実行できる場合(静的スキーマ)、これは明らかにそれを実行するための良い方法です。