在使用 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 对象在创建并保存到数据库中时,会经历以下状态:
- Init:初始状态,即文档对象被实例化后的状态
- Validate:数据验证状态,即 Mongoose 会执行模型上定义的数据验证操作,如果验证失败,状态将变为
ValidateFailure
。如果没有定义数据验证,则直接进入下一个状态 - Save:数据保存状态,即文档对象被保存到数据库中。如果保存失败,状态将变为
SaveFailure
- 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
属性来决定是对数据做新增操作还是更新操作;我们也可以根据状态来执行相应的错误处理等。
下面是一些常见的示例:
- 新增文档
----- ---- - ---------------------- - ----- ------ -- ----- ---- - --- ------ ----- ----- -- --------------- ---- -- - ------- ------------------- ---- ------------------- ---- --
- 更新文档
----- ---- - ---------------------- - ----- ------- ---- ------ -- ----- ---- - --- ------ ----- ------ ---- -- -- --------------- ---- -- - -- ----- ------------------- ---- - ------------------- ---- -- ----------- - --------------------- -- ---- - ---- - --------------------- -- ---- ------- - -- ---------- - - --
- 删除文档
----- ---- - ---------------------- - ----- ------ -- ------------------ ----- -- - -- ----- ------------------- ---- - ------------------- ----------------- ---- -- - -- ----- ------------------- ---- ------------------- ---- -- - --
结论
通过本文,我们已经初步了解了 Mongoose 中的 Document Life Cycle,并且学习了如何根据 Document 的状态来执行相应的操作。理解 Document 的状态有助于更有效、优雅的使用 Mongoose 来操作 MongoDB 数据库。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6739642e317fbffedf168dd9