Mongoose 中虚拟属性(Virtuals)实现示例

阅读时长 4 分钟读完

在 Mongoose 中,我们可以使用虚拟属性(virtuals)来创建一些计算属性,这些属性并不会被存储在数据库中,而是通过其他属性计算获取的。虚拟属性在一些场景下非常方便,比如对于某些数值型字段,我们可能需要对其进行一些计算后再进行展示或者操作,这时候虚拟属性可以大大简化代码和逻辑。

为了便于讲解,我们接下来会使用一个博客应用来进行示例。假设我们有以下两个 mongoose 模型:

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

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

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

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

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

接下来,我们来讲解两种虚拟属性的创建方法。

1. 使用 getset

通过 getset 方法,我们可以创建虚拟属性。

假设我们有一个 Post 模型,它有点赞数和评论数两个属性,我们需要计算它们的和作为一个虚拟属性。这时候,我们可以使用以下代码(注意,这里我们需要使用 function 关键字来声明函数,这样可以访问到 this 对象):

以上代码中,我们使用 postSchema.virtual 方法来声明虚拟属性,它接收两个参数,第一个参数是虚拟属性的名称,第二个参数是一个对象,包含 getset 两个方法来访问和设置虚拟属性。在我们的示例中,我们只需要使用 get 方法即可。此外,我们还通过 set 方法将虚拟属性添加到 toObjecttoJSON 两个选项中,这样在使用 res.send 或者 console.log 等方法输出 Post 对象时,我们也可以看到虚拟属性的值。当然,如果你不希望在 toObject 或者 toJSON 中输出虚拟属性,你可以将这两个选项的值设为 false

通过以上配置,我们可以这样来读取虚拟属性:

接下来,我们再来看一种创建虚拟属性的方式。

2. 使用 virtuals 属性

通过 virtuals 属性,我们也可以简单地创建虚拟属性。

我们来看一下以下示例代码:

以上代码中,我们使用 userSchema.virtual 方法声明虚拟属性,它也接收两个参数,第一个参数是虚拟属性的名称,和上面的方式一样;第二个参数是一个对象,包含 getset 两个方法,和上面的方式不同的是,在这种方式中我们使用一个对象来传递虚拟属性的 get 函数。

注意,在使用这种方式创建虚拟属性时,我们不能够使用 toObjecttoJSON 中输出虚拟属性的方法,而是需要在读取模型时手动调用 toJSON 方法来获取虚拟属性的值:

总结

本文针对 mongoose 中的虚拟属性进行了详细的讲解,并提供了两种方式来创建虚拟属性。希望读者能够通过本文学会如何使用虚拟属性来优化自己的代码。

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

纠错
反馈