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

在 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


猜你喜欢

  • 利用 ES7 的 @decortor 实现调用链

    前言 在前端开发中,我们经常需要对数据进行一系列的处理,这时候就需要用到调用链,将多个方法串联起来,达到数据的最终处理目的。ES7 标准中的 decorator 提供了一种简单的方式来实现调用链,下面...

    1 年前
  • 如何在 React 中使用最新的 ECMAScript 2021

    引言 React 作为当下非常流行的前端框架,不仅提供了强大的功能和运行效率,同时也为前端工程师提供了很多的便利性和扩展性。作为一个现代的框架,React 的环境也随着 JavaScript 语言的迭...

    1 年前
  • ESLint + Babel:如何在 ES6 代码中使用 import/export 语句

    ESLint + Babel:如何在 ES6 代码中使用 import/export 语句 前言 随着 ES6 的普及和 Web 应用的复杂度不断提高,模块化已经成为前端开发的标配。

    1 年前
  • 如何使用 TailwindCSS 不覆盖原来的样式

    TailwindCSS 是一个强大的 CSS 框架,它提供了许多常用的样式,可以帮助我们快速地构建网站和应用程序。然而,TailwindCSS 可能会覆盖原来的样式,导致我们的网站或应用程序出现不可预...

    1 年前
  • CSS Flexbox 实现三栏布局经典案例

    Flexbox 是 CSS3 的一个布局模式,可以很好地解决传统布局方式难以实现的问题,例如均分多列、不定宽高元素的布局等,更重要的是它能够帮助我们实现更灵活、响应式的布局。

    1 年前
  • React Router 的多级嵌套实现方法

    React Router 是一款常用的 React 组件库,用于实现前端路由功能。在实际项目中,难免会遇到多级嵌套路由的情况,本文将围绕 React Router 的多级嵌套实现方法进行详细介绍。

    1 年前
  • 集成 Redux 到 Angular 项目中的最佳实践

    Redux 是一个流行的 JavaScript 应用状态管理工具,它可以帮助开发者更好地管理应用程序的状态,同时它也是用于 React 的最佳实践之一。然而,Redux 也可以轻松地集成到 Angul...

    1 年前
  • RxJS 中的 Subject 源码分析

    Subject 是 RxJS 的重要概念之一,它允许 Observable 与 Observer 之间进行交互。事实上,Subject 本身既充当 Observable,又充当 Observer。

    1 年前
  • Redis 如何实现分布式缓存?

    引言 Redis 是一种基于内存的高效数据存储和缓存系统。它支持多种数据结构,并提供了丰富的命令用于数据操作。在 Web 开发中,Redis 通常被用于实现分布式缓存,以提高系统的性能和可扩展性。

    1 年前
  • 如何在 Mocha 中设置 before 和 after 钩子

    Mocha 是一个流行的 JavaScript 测试框架,它支持多种语言和各种类型的测试,包括单元测试、集成测试、端到端测试等。在 Mocha 中,可以通过设置 before 和 after 钩子来在...

    1 年前
  • Custom Elements 的命令生命周期图谱

    前言 Custom Elements 是 Web Components 标准规范中的一部分,它允许开发者创建自定义标签,封装成组件并集成到 Web 页面中。Custom Elements 拥有自己的生...

    1 年前
  • LESS 颜色函数的全面指南

    LESS 颜色函数的全面指南 LESS 是一种基于 CSS 的动态样式语言,它通过一系列的预处理器语言扩展了 CSS 的语法,使得样式表更加易于维护和扩展。LESS 为我们提供了强大的工具来处理 CS...

    1 年前
  • 在 Vue.js 应用中使用 Web Components 的技巧总结

    随着 Vue.js 的不断发展和普及,Web Components 技术也逐渐被前端开发者所接受和使用。Web Components 是一个由多种现有工具和标准组成的集合,如果我们在 Vue.js 应...

    1 年前
  • 如何解决 Socket.io 连接闪退问题

    前言 Socket.io 是一个面向实时 web 应用的 JavaScript 库,它建立在传输层协议 WebSocket 之上,提供了实时双向通信功能。但是在使用 Socket.io 过程中,经常会...

    1 年前
  • RESTful API 中的 HATEOAS 及其实践

    随着互联网的不断发展,Web API 的使用越来越普遍。在设计 Web API 时,常常需要考虑其安全性、性能、可重用性和可扩展性等方面,而 HATEOAS 可以帮助我们满足这些需求。

    1 年前
  • 解决 Fastify Plugins reply 重定向中的 502 错误

    Fastify 是一个高效、低开销的 Node.js Web 框架,它的插件系统使得构建服务器端应用非常的轻松和快速。然而,在使用 Fastify 的 reply 重定向功能时,我们可能会遇到 502...

    1 年前
  • Next.js 中如何使用 react-i18next 进行多语言处理?

    在现代 Web 应用程序中,多语言处理是一个重要的功能。因此,大多数现代前端框架和库都提供了用于实现多语言应用程序的选项。 Next.js 是一种流行的 React 框架,它提供了一种简单而优雅的方法...

    1 年前
  • Promise 中的 finally 方法详解

    Promise 中的 finally 方法详解 Promise 是一种让异步编程更加优雅的方式,它可以帮我们避免回调地狱(callback hell)并且更好地控制异步操作的流程。

    1 年前
  • 解决 Angular 中使用 HttpClient 发起请求出现 CORS 错误问题

    什么是 CORS CORS (Cross-Origin Resource Sharing) 是一种机制,它允许 Web 页面向不同源的服务器发起 XMLHttpRequest 请求。

    1 年前
  • Bootstrap 响应式表格的实现与优化

    Bootstrap 是一个流行的前端开发框架,它包含了很多 UI 组件和工具,其中 Bootstrap 响应式表格是最受欢迎和常用的之一。在本文中,我们将详细讨论如何使用 Bootstrap 生成响应...

    1 年前

相关推荐

    暂无文章