Mongoose 中使用 Virtuals 的方式及常见错误
在 Web 开发中,我们通常需要操作数据。而对于 Node.js 构建的 Web 应用来说,Mongoose 是一款非常优秀的 MongoDB 驱动包。其中,Virtuals 是 Mongoose 中用来处理虚拟属性的一个功能。本文将介绍通过 Mongoose 中的 Virtuals 实现虚拟属性的方式以及常见错误,包括相关的代码示例和指导意义。
什么是 Virtuals?
Mongoose 中的 Virtuals 可以理解为是一种类型的虚拟属性,它们是在数据库中不存储但是能提供辅助查询的属性。通常情况下,Mongoose 模型(Schema)实例的每个属性都需要在数据集中显式定义,但是 Virtuals 不需要。它们可以从其它属性生成,也可以手动创建。如果我们需要根据 Schema 的某些属性计算出一个新的属性,那么这便是使用 Virtuals 的良好场景。
Virtuals 的优势
虽然 Virtuals 在数据库中不存储,但是它们可以带来很多优势。
- 轻量级——Virtuals 只是 Mongoose 中的一个新增的选项,使用 Virtuals 不影响 MongoDB 中的数据库表结构。
- 能够缓存——和普通的 Schema property 一样,Virtuals 也可以缓存,使得查询速度更快。
- 能够作为附加属性——你可以将 Virtuals 作为普通属性一样使用,例如通过传递对象的方式来控制 Virtuals。
实现 Mongoose 中的 Virtuals
通过以下代码实现虚拟属性:
-- -------------------- ---- ------- ----- -------------- - --- ----------------- ---------- - ----- ------- --------- ----- ---------- -- -- --------- - ----- ------- --------- ----- ---------- -- - --- -- ---- ---- ---- ----------------------------------------------- -- - ------ ------------------ ------------------ --- ----- ------------- - -------------------------- ----------------
在上面的示例中,Schema 实例定义了 firstName 和 lastName。Virtuals 的定义需要使用 virtual() 方法。在虚拟属性的 get() 函数中,将 firstName 和 lastName 组合为 fullName。
通过及时更新所有属性来避免这些错误。如果你在定义模式时使用了默认值,请避免使用默认值。如果你想要支持更新原始属性(例如,firstName),请确保 Virtuals 同样支持。
-- -------------------- ---- ------- -- ---- -- - --- ----------------------------------------------- -- - ------ ------------------ ------------------ --------------- ---------- - ----- --------- - ---------------- --- -------------- - ------------ -- --- ------------- - ------------ -- --- ---------------------- -- ---- ----------- ------- ---- -------- -- -------- ------------- ----- ----- ----------------------------- ------------ ----------- ------ -------- ------------ ----- -------
在上述代码中,我们需要设置 Virtuals 属性 fullName 的设置器,以使其能够处理在数据集中直接更新 fullName 的情况。
总结
在本篇文章中,我们探讨了通过使用 Mongoose 中的 Virtuals 实现虚拟属性,并介绍了 Virtuals 相关的优点和实现方式。但是在使用中也会出现一些错误,因此我们还介绍了如何避免这些错误。我们希望读者能够从这篇文章中学习到更多关于 Mongoose 的知识,并能够有效地在应用程序中使用 Virtuals。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c2383383d39b488164328a