Mongoose 中的虚拟属性和虚拟方法

在使用 MongoDB 进行开发时很常用的工具就是 Mongoose。在 Mongoose 中,虚拟属性和虚拟方法是两个非常有用的功能,可以帮助我们更方便地操作数据,本篇文章将详细介绍 Mongoose 中的虚拟属性和虚拟方法使用方法和实例。

虚拟属性

虚拟属性是指能够在 Mongoose 模型中定义的,但是并没有在 MongoDB 数据库中保存的属性。它们可以像其他属性一样使用,但是在保存到数据库中时会忽略掉。虚拟属性通常用于对现有属性进行衍生或转换。

定义虚拟属性

在 Mongoose 模型中定义虚拟属性很简单:

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

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

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

上面的代码中,我们定义了一个名为 fullName 的虚拟属性,这个属性的值是通过 firstNamelastName 属性拼接而来的。其中,fullName 属性是通过调用 virtual 方法来定义的,这个方法传入的第一个参数为虚拟属性的名称,第二个参数为一个 get 方法,在这个方法内部我们可以自定义计算虚拟属性的值的逻辑。

使用虚拟属性

当我们获取一个 Mongoose 模型实例时,我们可以像获取普通属性一样获取虚拟属性:

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

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

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

注意:虚拟属性只会在获取值时计算一次,如果后续对相关属性进行了修改,虚拟属性的值不会自己更新。要想更新虚拟属性的值,需要手动调用 user.invalidate('fullName') 方法来通知 Mongoose 重新计算虚拟属性的值。

虚拟方法

虚拟方法是指能够在 Mongoose 模型中定义的方法,与虚拟属性不同的是,虚拟方法是一个函数。我们可以定义任何我们需要的方法,这些方法可以访问模型的其他属性和方法。

定义虚拟方法

在 Mongoose 模型中定义虚拟方法也很简单:

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

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

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

上面的代码中,我们定义了一个名为 getFullName 的虚拟方法,这个方法的返回值是一个函数,这个函数在被调用时返回 firstNamelastName 组成的字符串。

使用虚拟方法

当我们获取一个 Mongoose 模型实例时,我们可以像获取普通方法一样获取虚拟方法:

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

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

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

深入学习虚拟属性和虚拟方法

Mongoose 的虚拟属性和虚拟方法可以大大简化我们的业务逻辑代码,并且增强了 Mongoose 模型的灵活性。因此,深入掌握虚拟属性和虚拟方法的使用方法和实现原理对于 Mongoose 开发者来说非常重要。

使用示例

在一个 Blog 应用中,我们有一篇名为 My First Blog 的文章,存储在一个名为 Article 的 Mongoose 模型中:

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

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

现在我们希望可以通过 createdAt 属性获取文章的发布时间信息,但是 createdAt 是一个日期类型的属性,不太方便展示出来。因此,我们可以使用虚拟属性来获取格式化过的发布时间,并在默认文档转化为 JSON 格式时自动地展示出来:

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

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

此时,我们可以在获取 Article 实例时,直接通过 publishedAt 属性获取格式化过的发布时间信息:

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

实现原理

在 Mongoose 内部,虚拟属性和虚拟方法的实现是依赖于 JavaScript 中的 defineProperty 方法的,通过该方法,我们可以为一个对象定义虚拟属性和虚拟方法,并将真实的属性和方法绑定到对象上。在 Mongoose 中,虚拟属性和虚拟方法的调用都是通过 getset 方法来实现的。

对于虚拟属性,当我们尝试获取该属性的值时,Mongoose 会调用其 get 方法来计算虚拟属性的值并返回。

对于虚拟方法,当我们尝试调用该方法时,Mongoose 会调用其 get 方法获取方法本身,并返回一个函数,通过这个函数,我们就可以操作模型实例的其他属性和方法。

总结

通过本文,我们学习了 Mongoose 中的虚拟属性和虚拟方法,它们可以大大简化我们的代码逻辑并增强 Mongoose 模型的灵活性。在实际开发中,我们可以通过虚拟属性和虚拟方法来对实际数据进行衍生和转换,以便更方便地操作数据。同时,我们也深入学习了虚拟属性和虚拟方法的使用方法和实现原理,在这个基础上,我们可以更好地应用这些概念来实现我们的业务需求。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/648948b048841e9894793b88


猜你喜欢

  • 从 Prototype 到 ES6:ECMAScript 中语言的一些重大变化

    从 Prototype 到 ES6:ECMAScript 中语言的一些重大变化 随着互联网技术的迅猛发展,前端技术已成为如今最热门的领域之一。不同版本的 ECMAScript 也在持续不断地更新,其中...

    1 年前
  • ECMAScript 2019:让你的代码更优雅的字符串 replace

    replace() 是处理字符串中最常用的方法之一。从简单的文本替换到更复杂的正则表达式匹配,replace() 方法可以帮助我们快速轻松地对字符串进行操作。在 ECMAScript 2019 中,r...

    1 年前
  • ES6 的解构操作如何局部更新对象数组

    在前端开发中,经常需要处理对象和数组。ES6 中引入了解构操作,可以方便地从对象或数组中抽取出需要使用的属性或元素。但是,解构操作不仅仅是取值的工具,它还可以用来更新对象和数组。

    1 年前
  • 详解响应式设计中的 CSS Media Query

    随着智能手机和平板电脑等移动设备的飞速发展,越来越多的用户使用移动设备访问网站。而为了提供更好的用户体验,响应式设计成为了前端开发的必备技能之一。本文将详细解析响应式设计中的 CSS Media Qu...

    1 年前
  • Fastify 中的缓存实现方式

    在 Web 应用开发中,缓存的使用可以大大提升应用的性能,减少服务器压力和响应时间。Fastify 是一个高性能的 Node.js web 框架,通过使用缓存可以进一步提升其性能表现。

    1 年前
  • Promise 中 then 方法返回 Promise 的链式使用技巧

    Promise 中 then 方法返回 Promise 的链式使用技巧 在前端开发中,异步编程是一个非常重要的话题。而 Promise 是一种非常流行的异步编程解决方案。

    1 年前
  • 深入解析 ES9 中的 Promise.finally() 方法

    在 ES9 中,Promise 对象增加了一个新的方法:.finally()。该方法能够在 Promise 调用结束后,无论是 resolve 还是 reject,都会执行传入的函数,即无论成功与否,...

    1 年前
  • Docker 与 Kubernetes 的集成及应用实践

    在今天的云原生时代,Docker 和 Kubernetes 成为前端技术领域非常重要的一部分。Docker 是一款轻型容器化管理工具,允许开发者将应用程序和依赖项打包成一个独立的可运行的容器;而 Ku...

    1 年前
  • Sequelize 使用原始 SQL 查询

    Sequelize 是一个 Node.js 中流行的 ORM 库,它提供了丰富的 API 来帮助我们构建和管理数据库。但是,虽然 Sequelize 的常规查询使用非常简单,但在某些情况下,使用原始 ...

    1 年前
  • MongoDB 如何实现社交媒体平台中的数据存取?

    在社交媒体平台中,数据存取是非常重要的一环。MongoDB 是一种强大的 NoSQL 数据库,它具有高可扩展性、强大的查询语句和灵活的数据建模。在本文中,我们将讨论如何使用 MongoDB 来实现社交...

    1 年前
  • HapiJS 的跨域支持

    跨域(Cross-Origin Resource Sharing,CORS)是 Web 开发中常见的一种限制,它是一个安全机制,用于防止浏览器中的 JavaScript 代码实现通过 XMLHttpR...

    1 年前
  • TypeScript 中使用 Babel 转码器的指南

    随着 TypeScript 在前端开发中的广泛使用,开发者们也逐渐发现了一些 TypeScript 本身的限制,这势必给项目的开发和维护带来很多的麻烦。为了解决这些问题,许多开发者开始将 Babel ...

    1 年前
  • 使用 Webpack 进行前端性能优化的技巧

    随着前端开发技术的不断发展,我们需要处理越来越多的代码和资源。在这种情况下,使用 Webpack 进行前端性能优化就变得愈发重要。在这篇文章中,我们将介绍一些使用 Webpack 进行前端性能优化的技...

    1 年前
  • SASS 中的数据类型及其转换方法

    在前端领域,CSS 是实现页面样式的重要语言。而 Sass(Syntactically Awesome Style Sheets) 是一种基于 CSS 的扩展语言,提供了许多实用的功能和语法,并简化了...

    1 年前
  • ECMAScript 2017 中的三种箭头函数的使用方法

    箭头函数是在 ES6 中引入的,它们是一种简洁和便捷的函数声明方式。在 ECMAScript 2017 中,有三种箭头函数的使用方法,接下来我们会逐一进行介绍,包括每种使用方法的详细语法和示例代码。

    1 年前
  • Angular 中如何使用 Angular Material UI 组件

    Angular Material UI 组件是 Angular 框架下的一套 UI 组件库,它提供了一系列的预构建组件,包括按钮、卡片、对话框、侧边栏等等,用于快速构建现代化的网站和 Web 应用程序...

    1 年前
  • Express.js 如何处理 CORS(跨域资源共享)问题

    在 Web 开发中,跨域请求是很常见的情况。例如,前端代码在一个域名下运行,但需要请求另一个域名下的 API 接口。这时候,根据同源策略的限制,前端请求会被浏览器拦截。

    1 年前
  • CSS Grid 布局实例:使用 Grid 布局美化博客文章列表

    本文将介绍如何使用 CSS Grid 布局来美化博客文章列表,同时也会深入讲解 Grid 布局的相关知识点。 Grid 布局简介 Grid 布局是一个二维的布局系统,在 CSS 中用于构建复杂的网...

    1 年前
  • GraphQL 中如何处理时间日期数据

    前言 在客户端和服务器端之间传输数据的过程中,时间和日期数据属于比较常用的数据类型。在 GraphQL 中如何处理这些数据呢?本文将会为大家介绍 GraphQL 中如何处理时间日期数据。

    1 年前
  • 无障碍场景下 MacOS 下的 WebView 事件处理

    随着计算机在社会和生活中的广泛应用,无障碍技术也成为了我们不可忽视的重要方面。在传统的桌面应用程序中,我们通常使用鼠标和键盘来与用户进行交互,但是对于一些身体残障的用户,使用鼠标和键盘操作可能会带来困...

    1 年前

相关推荐

    暂无文章