Mongoose 中的 Document Life Cycle 详解

在使用 Mongoose 进行 MongoDB 数据库操作时,我们经常会涉及到文档(document)的概念。而 Mongoose 也提供了 Document 类型来帮助我们完成对文档的操作。但是,Document 对象在自身被创建并保存到数据库时会经历一系列的状态变化。本文将介绍 Mongoose 中的 Document Life Cycle(文档生命周期),以及如何利用这些状态来完成更高效、更优雅的开发。

Document 类型简介

Mongoose 中的 Document 类型是 Model 类型的实例,也就是说,当我们从数据模型中创建实例对象时,就得到了一个文档对象。Document 实例对象具有一些特殊的属性和方法,包括:

  • _id: 文档在数据库中的唯一标识符
  • isNew: 一个布尔类型,表示该文档是否从未存在于数据库中过
  • save(): 将文档保存到数据库中
  • remove(): 将文档从数据库中删除
  • update(updateQuery): 对文档进行更新,updateQuery 是要更新的内容

除此之外,Document 还具有状态,这也是本文将要介绍的核心内容。

Document Life Cycle

Document 对象在创建并保存到数据库中时,会经历以下状态:

  1. Init:初始状态,即文档对象被实例化后的状态
  2. Validate:数据验证状态,即 Mongoose 会执行模型上定义的数据验证操作,如果验证失败,状态将变为 ValidateFailure。如果没有定义数据验证,则直接进入下一个状态
  3. Save:数据保存状态,即文档对象被保存到数据库中。如果保存失败,状态将变为 SaveFailure
  4. Remove:数据删除状态,即文档对象被从数据库中删除。如果删除失败,状态将变为 RemoveFailure

下面将分别介绍这些状态,并附带示例代码实现。

Init

这个状态是文档对象创建后的最初状态,它还没有被保存到数据库中,并且没有被操作过。一般在创建 Model 的实例后,就进入了 Init 状态。

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

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

在这段代码中,我们创建了一个 User 的 Model 实例,然后创建了一个实例 user。实例被创建后,isNew 属性将被设置为 true,因为它还没有被保存到数据库中。

Validate

在文档对象被保存到数据库之前,Mongoose 会执行数据验证操作。如果验证操作失败,文档对象会进入 ValidateFailure 状态。

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

在这个例子中,我们创建了一个 Model,定义了一个必选属性 name,然后我们实例化了一个 User 对象,并且将 name 属性设置成了 ‘foo’,并试图将其保存到数据库中。这里因为 name 属性必选,如果文档对象未设置 name 属性,ValidateFailure 状态将会被引发。

Save

当数据验证通过后,文档对象将进入到 Save 状态。在文档对象被保存到数据库之前,Mongoose 会执行钩子函数,并检查是否设定了 _id 属性。在 Mongoose 中,文档对象的 _id 属性默认是自动生成的,Mongoose 也支持在文档创建时手动指定 _id

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

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

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

在这个例子中,我们定义了一个 User Model,然后创建了 user1 和 user2 两个实例对象,其中 user1 没有设置 _id 属性,该对象在保存到数据库时会自动生成一个 _id;而 user2 则手动创建了一个 _id 属性,并将其作为文档保存到了数据库中。

Remove

当 Document 对象从数据库中被删除时,它将进入 Remove 状态。在这个状态下,Mongoose 会执行钩子函数,对应的数据也会从数据库中删除。

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

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

在这段代码中,我们创建了一个 User 的 Model 实例,并将其保存到数据库中。然后删除该实例,并重新检查实例的 isNew 属性值,可以看到该实例已经从数据库中被删除,并重新回到了 Init 状态。

如何使用 Document 状态

Document 的状态可以为我们提供很多开发的便利。我们可以根据 Document 的状态来执行不同的操作。例如,我们可以利用 isNew 属性来决定是对数据做新增操作还是更新操作;我们也可以根据状态来执行相应的错误处理等。

下面是一些常见的示例:

  1. 新增文档
----- ---- - ---------------------- - ----- ------ --
----- ---- - --- ------ ----- ----- --

--------------- ---- -- -
  ------- -------------------
  ---- ------------------- ----
--
  1. 更新文档
----- ---- - ---------------------- - ----- ------- ---- ------ --

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

--------------- ---- -- -
  -- ----- -------------------
  ---- -
    ------------------- ----
    -- ----------- -
      ---------------------
      -- ----
    - ---- -
      ---------------------
      -- ----
      ------- - --
      ----------
    -
  -
--
  1. 删除文档
----- ---- - ---------------------- - ----- ------ --
------------------ ----- -- -
  -- ----- -------------------
  ---- -
    -------------------
    ----------------- ---- -- -
      -- ----- -------------------
      ---- ------------------- ----
    --
  -
--

结论

通过本文,我们已经初步了解了 Mongoose 中的 Document Life Cycle,并且学习了如何根据 Document 的状态来执行相应的操作。理解 Document 的状态有助于更有效、优雅的使用 Mongoose 来操作 MongoDB 数据库。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6739642e317fbffedf168dd9