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