在 Mongoose 中,我们经常需要使用子文档来表示复杂的数据模型。然而,在更新子文档时,我们可能会遇到一些问题,比如更新后的数据并没有被正确保存。这时,我们需要了解 markModified 方法的作用,来解决这个问题。
问题描述
假设我们有以下的数据模型:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ----------- - --- ----------------- ----- ------- ---- ------ --- ----- ------------ - --- ----------------- --------- ------------- --- ----- ------ - ------------------------ --------------
我们创建了一个父亲对象和两个儿子对象:
-- -------------------- ---- ------- ----- ------ - --- -------- --------- - - ----- ------ ---- -- -- - ----- -------- ---- -- - - ---
现在,我们想要更新其中一个儿子的年龄:
parent.children[0].age = 11; parent.save();
然而,当我们查询父亲对象时,会发现年龄并没有被更新:
Parent.findOne({}, (err, doc) => { console.log(doc.children[0].age); // 输出 10,而不是 11 });
markModified 方法
这是因为 Mongoose 并没有意识到我们对子文档进行了修改。MongoDB 是一个 NoSQL 数据库,它默认认为用户不会在语义上修改自己的文档。因此,当我们修改嵌套的文档时,需要告诉 Mongoose 手动更新这个文档。
这时,我们可以使用 markModified 方法来通知 Mongoose 进行更新。在上面的例子中,我们可以这样更新:
parent.children[0].age = 11; parent.markModified('children'); parent.save();
这样,就能正确地更新子文档了。
markModified 方法的限制
markModified 方法有一些限制,需要注意:
- 对一个对象的多个属性进行修改时,必须使用多个 markModified 方法,而不能使用一个 markModified 方法。
- 对一个数组中的元素进行修改时,必须使用 markModified 方法,而不能只对整个数组使用 markModified 方法。
示例代码
我们再来看一个例子。假设我们现在要将 Jerry 的年龄减少两岁,并修改其名字:
parent.children[1].age -= 2; parent.children[1].name = 'Jack'; parent.markModified('children.1.age'); parent.markModified('children.1.name'); parent.save();
这样,就能正确地更新子文档了。
结论
在 Mongoose 中,我们需要使用 markModified 方法来告诉 Mongoose 进行手动更新。使用这个方法时,需要注意上述的限制。当我们使用子文档时,需要注意这个方法,以避免更新问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676f694de9a7045d0d7296f6