Mongoose 的 Virtual 使用详解及注意事项

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

Mongoose 是 Node.js 使用最广泛的 MongoDB 驱动程序,它提供了 Virtual 功能,用于定义不保留在数据库中的属性。在本文中,我们将介绍 Mongoose 中 Virtual 的详细使用方法和注意事项,并提供示例代码,帮助您更好地理解。

什么是 Virtual?

Virtual 是一个与 Model 实例相关联的属性,该属性不会被存储在 MongoDB 文档中。我们可以使用 Virtual 属性将两个或多个属性合并成一个属性或根据已存储的属性计算新属性。

Virtual 可以定义为两种类型:

  • Getter:当虚拟属性被访问时,将返回计算值。
  • Setter:当虚拟属性被设置时,它将计算出该属性的计算值,并返回给用户。

Mongoose 支持使用 getset 选项来创建这两种类型的 Virtual 属性。

创建 Virtual 属性

要创建一个 Virtual 属性,我们首先需要创建一个 Schema,然后再在该 Schema 中添加 Virtual 属性。以下是创建一个包含 Virtual 属性的示例 Schema:

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

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

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

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

在上面的示例中,我们定义了一个名为 AuthorSchema 的 Schema,并在其上调用了 virtual() 方法,告诉 Mongoose 我们将要创建一个虚拟属性。接下来,我们使用 get 方法定义了 fullName 属性的 getter 函数,该函数将返回 firstNamelastName 的值组成的字符串。

我们可以使用下面的代码来验证这个 Virtual 属性的工作原理:

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

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

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

在上面的代码中,我们使用 new 关键字创建一个 Author 实例,然后通过 fullName 属性获取作者的全名。

警告:不要直接设置 Virtual 属性

Virtual 属性是只读的,这意味着您不能用赋值语句直接设置这些属性。例如,您不能使用 author.fullName = 'Jane Doe'; 这样的代码将作者的全名更改为“Jane Doe”,因为 Virtual 属性没有与原始文档关联的存储值。

要更改属性的值,请更改原始属性,然后再使用 Virtual 属性计算新值,或者使用 setter 函数。

下面是一个更改 Virtual 属性值的错误示例:

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

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

创建 Virtual 属性时的性能注意事项

从值的角度来看,Virtual 属性的计算是相当昂贵的。如果您定义了大量 Virtual 属性,那么您的模型可能会变得非常缓慢。在进行大型查询时,可以避免使用 Virtual 属性。

Virtual 属性与实时计算的区别

当您创建 Virtual 属性时,Mongoose 实际上并未在数据库中存储该属性。这意味着获取 Virtual 属性的值需要计算,而实时计算属性则存储在数据库中,并随着每次保存变为最新的值。

具体来说,如果您希望在存储的数据上执行有效的计算,则应使用实时计算属性。但是,如果您的目标是使用多个属性创建新的 Virtual 属性,或者您只需要获取计算得到的值,然后丢弃每个属性的值,则 Virtual 是更好的选择。

结论

在本文中,我们介绍了 Mongoose 中 Virtual 的概念,及其创建 Virtual 属性的方法和注意事项。使用 Virtual 属性可以帮助我们将逻辑组织得更好,并避免对数据库的频繁访问。但是在大型查询或查询更新方面,使用 Virtual 属性可能并不是最好的选择。希望本文可以为您提供帮助,带您更深入地了解 Virtual 在 Mongoose 中的使用。

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


猜你喜欢

  • 使用 Next.js 实现微服务的最佳实践

    随着微服务架构的流行,越来越多的应用程序将用户界面和后端业务逻辑分离。对于前端团队来说,这意味着需要使用不同的技术来构建应用程序,以及使用新的方法来处理数据和服务。

    13 天前
  • Chai 如何对 HTTP 请求进行测试?

    Chai 如何对 HTTP 请求进行测试? 前端开发中,我们经常需要对 API 的数据请求和响应进行测试。Mocha 是一个灵活的 JavaScript 测试框架,Chai 是一个用于编写断言的 Ja...

    13 天前
  • Node.js 中使用 Gulp 实现前端自动化构建

    随着前端开发的日益复杂,传统的手动构建已经无法满足开发效率和质量的要求。而自动化构建则成为现代前端工程化的必要手段之一。Gulp 是一个流式构建工具,其简单易用和灵活可扩展的特点使其在前端自动化构建领...

    13 天前
  • 如何在 PWA 应用中添加简单的图像滤镜效果

    在现代网络应用程序开发中,PWA(渐进式网络应用程序)已经成为一个流行的技术解决方案,它可以使 web 应用程序具有原生应用程序的功能。其中一个关键特性是可以在离线状态下访问 web 应用程序。

    13 天前
  • Socket.io 如何实现群聊

    Socket.io 是一个基于 Node.js 的实时应用程序框架,可以轻松地为 Web 应用程序添加双向通信功能,例如实时聊天和实时数据分析。 在本文中,我们将探讨如何使用 Socket.io 实现...

    13 天前
  • 使用 LESS 进行快速、模块化和维护性高的 CSS

    CSS 是网页开发中必不可少的一部分,但是当项目变得越来越庞大时,CSS 可能会变得难以维护和更新。此时,LESS 的出现可以让我们更加高效地编写 CSS,进行模块化管理和提高代码可读性。

    13 天前
  • Serverless 架构下如何实现自动化测试

    随着云计算和无服务器架构的发展,越来越多的应用已经迁移到了无服务器架构上。在这种情况下,如何实现自动化测试以保证应用的可靠性和稳定性成为诸多前端开发人员关注的问题。

    13 天前
  • Deno 下性能优化的手段与技巧

    Deno 是一款现代的 JavaScript 和 TypeScript 运行时环境,它是由 Node.js 的创造者 Ryan Dahl 设计的。与 Node.js 不同的是,Deno 采用了 V8 ...

    13 天前
  • 解决 AngularJS 显示不出图片的问题

    如何解决 AngularJS 显示不出图片的问题 在 AngularJS 中,显示图片是一个重要的功能,特别是在开发中需要展示大量的图片时。但是,有时会遇到显示图片失败的问题,导致无法正常显示图片。

    13 天前
  • ECMAScript 2021 (ES12) 中的 BigInt 数据类型,应对大整数计算

    在传统的 JavaScript 中,数字的最大值为 2 的 53 次方。对于大于该值的计算,传统的 Number 数据类型将产生精度丢失等问题。为了解决这些问题,ECMAScript 2021 (ES...

    13 天前
  • 使用 Mocha 从零开始构建一个完整的 Node.js 应用测试框架

    在 Node.js 中,测试是非常重要的一环。测试能够确保我们的代码正确运行,同时也能加速我们的开发过程。而 Mocha 则是 Node.js 最流行的测试框架之一。

    13 天前
  • Kubernetes 中的 Job 和 CronJob 的使用

    随着 Kubernetes 的普及和使用,Job 和 CronJob 成为了管理容器化应用程序的重要工具。这两个资源对象允许我们在 Kubernetes 上安排一次性任务或定期重复任务的运行。

    13 天前
  • 如何编写高效的 Redux 中间件

    Redux 中间件是 Redux 核心概念中的一个重要组成部分,它允许开发者在 Redux 的 Action 发送和 Reducer 处理过程中添加自定义逻辑。 在实际的项目中,我们通常需要使用 Re...

    13 天前
  • Headless CMS 在全球化应用中的应用场景分析

    Headless CMS 是指将内容管理与展示分离的一种 CMS 架构,它的特点是将内容作为数据存储,并通过 API 提供给前端,以便前端可以自由定制界面和样式。在多语言和全球化应用中,Headles...

    13 天前
  • 避免 TypeScript “this” 指针指向错误问题

    在使用 TypeScript 开发前端应用中,this 指针指向错误是一个常见的问题。在 JavaScript 中使用 this 有时会产生很多混淆的问题,因为 this 表示的是正在执行的函数的上下...

    13 天前
  • 使用 Fastify 和 Socket.IO 实现实时通信服务

    随着互联网的发展,实时通信技术已经成为很多网站必备的功能之一。在前端领域,使用 Fastify 和 Socket.IO 结合起来可以非常方便地实现实时通信服务。本文将详细介绍如何使用这两个工具来构建实...

    13 天前
  • 如何使用 Chai 对 JSON 对象进行断言?

    在前端开发中,我们经常需要对 JSON 对象进行断言,以确保我们的代码输出符合预期。在这种情况下,Chai 是一个非常好用的断言库,它可以与我们喜欢的测试库和框架结合使用,如 Karma、Mocha ...

    13 天前
  • RESTful API 测试实践:从接口测试到构建可靠性测试

    前言 RESTful API 是现代 Web 应用程序中常用的一种架构风格,其设计原则包括可读性、可扩展性、可靠性和可维护性等。在前端开发中,与后台交互的数据通常是通过 RESTful API 进行传...

    13 天前
  • ECMAScript 2021(ES12)中的 Promise.finally() 方法,统一处理 Promise 中的 finally 逻辑

    在 JavaScript 中,Promise 被广泛使用,它可以异步处理数据并且提供了便捷的 API。Promise 中有三种状态:Pending(准备中)、Resolved(已完成)和Rejecte...

    13 天前
  • iOS 应用性能优化实践:提高响应速度的技巧与方法

    当用户打开一个 iOS 应用时,第一件印象最重要的是反应速度。如果一个应用反应速度慢,那么用户可能就没有耐心等待,转而寻找其他类似的应用。因此,提高应用的响应速度是非常重要的。

    13 天前

相关推荐

    暂无文章