mongoose复杂类型doc.save()无法更新的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012769002/article/details/85266393

原始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.

猜你喜欢

转载自blog.csdn.net/u012769002/article/details/85266393