在开发 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