Mongoose 中子文档更新问题 —— 理解 markModified 方法

阅读时长 3 分钟读完

在 Mongoose 中,我们经常需要使用子文档来表示复杂的数据模型。然而,在更新子文档时,我们可能会遇到一些问题,比如更新后的数据并没有被正确保存。这时,我们需要了解 markModified 方法的作用,来解决这个问题。

问题描述

假设我们有以下的数据模型:

-- -------------------- ---- -------
----- -------- - --------------------

----- ----------- - --- -----------------
  ----- -------
  ---- ------
---

----- ------------ - --- -----------------
  --------- -------------
---

----- ------ - ------------------------ --------------

我们创建了一个父亲对象和两个儿子对象:

-- -------------------- ---- -------
----- ------ - --- --------
  --------- -
    -
      ----- ------
      ---- --
    --
    -
      ----- --------
      ---- --
    -
  -
---

现在,我们想要更新其中一个儿子的年龄:

然而,当我们查询父亲对象时,会发现年龄并没有被更新:

markModified 方法

这是因为 Mongoose 并没有意识到我们对子文档进行了修改。MongoDB 是一个 NoSQL 数据库,它默认认为用户不会在语义上修改自己的文档。因此,当我们修改嵌套的文档时,需要告诉 Mongoose 手动更新这个文档。

这时,我们可以使用 markModified 方法来通知 Mongoose 进行更新。在上面的例子中,我们可以这样更新:

这样,就能正确地更新子文档了。

markModified 方法的限制

markModified 方法有一些限制,需要注意:

  • 对一个对象的多个属性进行修改时,必须使用多个 markModified 方法,而不能使用一个 markModified 方法。
  • 对一个数组中的元素进行修改时,必须使用 markModified 方法,而不能只对整个数组使用 markModified 方法。

示例代码

我们再来看一个例子。假设我们现在要将 Jerry 的年龄减少两岁,并修改其名字:

这样,就能正确地更新子文档了。

结论

在 Mongoose 中,我们需要使用 markModified 方法来告诉 Mongoose 进行手动更新。使用这个方法时,需要注意上述的限制。当我们使用子文档时,需要注意这个方法,以避免更新问题。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676f694de9a7045d0d7296f6

纠错
反馈