mongoose複雜類型doc.save()無法更新的問題

原始document:

{
    "_id" : ObjectId("5c234903be557205da9343d7"),
    "apps" : {},
    "createTime" : NumberLong(1545816310609),
    "updateTime" : NumberLong(1545816310609)
}

apps爲複雜類型,當進行更新時

const user = await User.findById('5c234903be557205da9343d7');
user.apps = { test: 'value' };
await user.save();

假如apps只有單層更新時,會正常更新

Mongoose: users.findOne({ _id: ObjectId("5c234903be557205da9343d7") }, { fields: {} })
Mongoose: users.update({ _id: ObjectId("5c234903be557205da9343d7") }, { '$set': { apps: { test: 'value' } } })

當apps需要增加屬性時,

user.apps.test2 = value2;
await user.save();

mongoose檢測不到你的屬性更新了,所以不會執行任何更新語句。

解決辦法

user.markModified('apps.test2');

然後就可以正常更新了

Mongoose: users.update({ _id: ObjectId("5c234903be557205da9343d7") }, { '$set': { 'apps.test2': 'value2' } })

Mongoose文檔中有提到

Since it is a schema-less type, you can change the value to anything else you like, but Mongoose loses the ability to auto detect and save those changes. To tell Mongoose that the value of a Mixed type has changed, you need to call doc.markModified(path), passing the path to the Mixed type you just changed.

Marks the path as having pending changes to write to the db.
Very helpful when using Mixed types.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章