Mongoose 的虚拟属性使用方法

阅读时长 7 分钟读完

介绍

Mongoose 是 MongoDB 的一种对象模型工具,它在使用 MongoDB 时提供了更加易用和便利的 API,同时支持丰富的中间件和插件。而虚拟属性是 Mongoose 中一个非常有用的功能,它可以让我们在模型中定义一些属性,这些属性不会被真正的存储到数据库中,但是我们可以在代码中使用它们,以及通过它们获取和设置其他实际存储在数据库中的属性。

使用场景

虚拟属性在很多情况下可以方便我们的开发,比如:

  • 我们需要根据某些实际属性计算出一些值,并将这些值暴露给前端。
  • 我们需要将多个实际属性合并到一个虚拟属性中,并将其作为一个单独的字段暴露给前端。
  • 我们需要对某些实际属性进行过滤或者转换,并将转换后的结果暴露给前端,而不影响实际数据的存储。

使用方法

在 Mongoose 中定义一个虚拟属性非常简单,只需要在 Schema 中使用 virtual 方法即可。virtual 方法有两种方式,一种是通过 getter 和 setter 函数实现,另一种是通过虚拟属性的配置对象实现。下面我们来看一下具体的使用方法。

通过 getter 和 setter 函数实现

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

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

上面的代码中,我们首先定义了一个 person 的 Schema,其中包括了 firstName 和 lastName 两个实际属性。然后我们通过 virtual 方法定义了一个名为 fullName 的虚拟属性,它由 firstName 和 lastName 两个实际属性计算得出。我们通过 getter 函数获取 fullName 的值,通过 setter 函数设置 fullName 的值,并在 setter 函数中计算出 firstName 和 lastName 的值。

在上面的代码中,我们通过 Person 构造函数创建了一个 person 对象,然后通过 fullName 获取了其全名。接下来我们通过 fullName 的 setter 设置了其全名,从而修改了 firstName 和 lastName 的值。

通过虚拟属性的配置对象实现

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

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

上面的代码使用了箭头函数来简化 getter 和 setter 函数的表达方式。我们在 virtual 方法中传入一个配置对象,该对象包含了 getter 和 setter 的函数。

输出结果和前面的例子一样。

虚拟属性的常用场景

在上文中我们提到了一些虚拟属性的常用场景,下面我们分别介绍一下它们的实现方法。

计算值并暴露给前端

在上面的代码中,我们通过虚拟属性计算出了订单的总价钱,并将其转换成美元格式,最后暴露给前端。

合并属性并暴露给前端

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

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

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

在上面的代码中,我们通过虚拟属性 personInfo 将 fullName 和 email 属性合并到一个对象中,并将其暴露给前端。

过滤和转换属性并暴露给前端

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

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

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

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

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

在上面的例子中,我们将 firstName 和 lastName 属性转换成大写字母,并将转换后的值暴露给前端。

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

纠错
反馈

纠错反馈