理解 Mongoose Schema 的 virtuals 特性

在开发 Node.js 应用程序时,Mongoose 是一个伟大的数据库工具,它提供了方便的数据建模和库 API。除了基本的 CRUD 操作,Mongoose 还提供了许多有用的特性,其中一个就是 virtuals 特性。

背景

在面对 Mongoose 和 MongoDB 的时候,我们通常会遇到这样一个问题:MongoDB 的文档模式如何映射到 JavaScript 对象模型。用 JavaScript 格式表示 MongoDB 文档的最简单方法是使用对象字面量,但这种方法过于简单,不能到达通用的应用程序的要求。

另外一个方法是用“Schema”来表示 MongoDB 的文档集合。类似于 SQL 的 table 结构,将每个字段指定类型、默认值等等,可以保证数据的规范性和完整性。

但在某些业务场景中,我们需要在 Mongoose 模型中加入一些额外的虚拟字段,例如,我们想根据 firstName 和 lastName 合并出一个完整的 name 值,而不需要将其存储在实际的文档中。这个时候,虚拟字段就起到了作用。

什么是 virtuals

虚拟字段实际上不是真正的字段,而是通过原始文档中不同的字段计算出来的值。这些字段不会被 Mongoose 存储在数据库中,但这些值可以像普通字段一样使用。

我们可以使用 getter 和 setter 方法来定义虚拟字段。get 方法允许我们在访问虚拟字段时执行代码,而 set 方法允许我们在设置虚拟字段时执行代码。

设计虚拟字段有一个好处,它是可重用的,也可以减少数据的冗余,减少不必要的计算时间和存储空间。

如何使用 virtuals

下面是一个简单的例子,将 firstName 和 lastName 合并成一个 name 虚拟字段:

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

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

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

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

在上面的例子中,我们定义一个 userSchema 模型,其中包含 firstName 和 lastName 两个字段。然后我们定义一个虚拟字段 name,它是由 firstName 和 lastName 拼接而成的。

请注意,在 get 方法中,我们返回了一个拼接的字符串,而在 set 方法中,我们将输入的字符串拆分并将其赋值给 firstName 和 lastName。

现在我们可以在查询文档时使用虚拟字段:

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

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

对于用户来说,他们可以在数据库中保存了 firstName 和 lastName,但是可以通过 name 虚拟字段来访问这两个字段的值。

总结

虚拟字段是用于在 Mongoose 模型中执行计算操作的强大选择。通过将需要进行操作的字段拼接、转换或删除,虚拟字段使数据更易于使用,同时减少了存储和计算的成本。

本文介绍了虚拟字段的概念,以及如何在 Mongoose 模型中使用它们。通过实现这个小例子,您可以开始理解和使用虚拟字段,以便更好地管理、转换和优化数据。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/664cbe42d3423812e4bd949e