Mongoose 中的 Virtuals 方法和功能详解

阅读时长 5 分钟读完

在使用 Mongoose 进行数据库操作的过程中,Virtuals 方法是一种十分常见且有用的功能。通过 Virtuals 方法,我们可以在获取和修改数据的过程中,将一些非数据库中存储的属性与模型绑定在一起,使得我们的代码更加简洁易读,且符合封装的原则。

Virtuals 的定义和使用

Virtuals 在 Mongoose 中的定义方式如下:

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

--------------------------------------------- -
  ------ --------------- - - - - ---------------
---
展开代码

其中,我们通过 virtual 方法来定义一个名为 fullName 的虚拟属性,在这里,我们可以使用 get 方法来指定获取虚拟属性所需要执行的函数。在该函数中,我们可以自行定义虚拟属性的取值方式,可以根据数据库中的数据来组合属性,也可以根据当前对象的状态来返回属性值。

在使用 Virtuals 的过程中,我们可以通过模型实例来获取虚拟属性:

除此之外,我们还可以通过 toObject 或者 toJSON 方法将虚拟属性转化为普通属性:

Virtuals 的指导意义

通过使用 Mongoose 中的 Virtuals 方法,我们可以将多个属性合并为一个属性,这样不仅可以更好地符合实际模型的设计,还可以消除很多不必要的繁琐代码,同时,也能提升代码的可读性和易用性。比如,在上面的示例中,我们将 name 对象中的 firstlast 属性组合成了一个 fullName 属性,这样一来,在获取和设置用户的全名时,我们只需要操作一个属性即可,而不需要分别实现两个属性,或者写一些复杂的计算属性方法来生成全名。

示例代码

为了更好地展示 Virtuals 方法的使用,我们可以在一个真实的数据模型中,添加一些虚拟属性,让我们能够更好地理解其用法。

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

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

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

----- ---- - ---------------------- ------------
展开代码

在上述代码中,我们定义了一个包含三个属性的用户模型,分别为 firstName, lastNameemail。在此基础上,我们添加了两个虚拟属性,分别为 fullNamegravatarUrl。在 fullName 中,我们将 firstNamelastName 进行组合,并返回用户的全名;在 gravatarUrl 中,我们使用 Node.js 中的 crypto 库进行 MD5 加密,根据加密结果生成用户的 Gravatar 头像地址。

通过这样的定义,我们在获取用户数据时,可以直接读取虚拟属性,而无需额外的计算和操作。比如,我们可以通过以下方式获取一个用户对象,并利用其虚拟属性获取用户的全名和头像地址:

综上所述,Virtuals 方法是 Mongoose 中一个常用的特性,通过使用虚拟属性,我们可以让代码更加符合封装的原则,使其更加简洁易读。在设计数据模型时,我们也应该充分考虑到 Virtuals 的使用,用于减少冗余代码,提高代码的可读性和可维护性。

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

纠错
反馈

纠错反馈