Mongoose 中虚拟属性和普通属性的区别及应用场景

阅读时长 5 分钟读完

前言

Mongoose 是 Node.js 上非常受欢迎的 MongoDB ODM,能够帮助我们更方便的在 JavaScript 中操作 MongoDB。虚拟属性是 Mongoose 中非常强大的功能之一,它可以让我们在查询数据库时自动计算一些值,从而避免了多余的计算和存储。

普通属性和虚拟属性的区别

在 Mongoose 中,一个模型实例通常由两种属性组成:从数据库中获取的普通属性和在模型定义中定义的虚拟属性。普通属性是数据库表中的真实字段,而虚拟属性则不会存在于数据库表中。

在数据库中存储某个值需要相应的空间,而有时我们不需要在数据库表中存储一个字段的值,而是根据其他字段计算出来显示该属性。这时,虚拟属性就可以派上用场了。

应用场景

虚拟属性主要的应用场景是构造复杂的属性值和优化数据库访问。以下是一些常见的应用场景:

计算属性

我们可以使用虚拟属性,将模型属性计算后放到一个新的属性中。示例代码如下:

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

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

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

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

在上面的示例代码中,我们在 PostSchema 上定义了一个名为 abstract 的虚拟属性,并在属性的 get 函数中计算文章的摘要。

关联属性

我们可以使用虚拟属性将两个模型实例之间的关联链接起来。例如,在微博中,每个用户都可以发布多篇微博,我们可以使用虚拟属性获取用户发表的所有微博。示例代码如下:

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

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

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

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

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

在上面的示例代码中,我们在 UserSchema 上定义了一个名为 posts 的虚拟属性,它的 ref 属性指向 Post 模型,它的 localField 属性指向 _id 字段,它的 foreignField 属性指向 author 字段。在定义完虚拟属性后,我们可以使用 populate 进行关联查询。

格式化日期

我们可以使用虚拟属性将日期格式化为特定的显示格式。示例代码如下:

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

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

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

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

在上面的示例代码中,我们在 UserSchema 上定义了一个名为 createdAtFormatted 的虚拟属性,并在属性的 get 函数中使用 moment.js 格式化日期。

使用方法

在 Mongoose 中,我们可以通过以下方式定义虚拟属性:

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

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

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

在上面的代码中,我们在 schema 实例上使用 virtual 方法定义了一个名为 name 的虚拟属性,并在属性的 get 函数中将 firstlast 属性拼接后返回。

总结

虚拟属性是 Mongoose 中非常有用的功能,它可以大大简化我们的代码实现,并优化数据库访问。在使用虚拟属性时,我们需要根据实际业务场景灵活运用,在查询数据库时自动计算一些值,从而避免了多余的计算和存储。

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

纠错
反馈