Mongoose 中的 Virtuals:虚拟属性和虚拟参考字段

虚拟属性和虚拟参考字段是 Mongoose 中非常重要的概念。虚拟属性是指在存储到数据库中之前,可以将一些属性计算出来,并将其添加到文档中。虚拟参考字段是指在一些文档中存储其他文档的引用,但是这些文档并不会真正存储到数据库中。

这篇文章将会详细地介绍 Mongoose 中的虚拟属性和虚拟参考字段,并提供一些实用的示例。

虚拟属性

在 Mongoose 中,虚拟属性是通过定义一个 getter 方法来实现。这个 getter 方法可以使用本地文档数据计算出一个新的值。

在下面的示例中,我们定义了一个叫做 fullName 的虚拟属性,用来拼接 firstNamelastName

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

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

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

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

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

这个 Person 模型有两个属性:firstNamelastName。但是,我们也对模型定义了一个虚拟属性 fullName。通过定义我们的 getter 方法,我们自动计算了属性 fullName 的值,它会返回 firstNamelastName 的拼接结果。

虚拟属性的另一个常见使用场景是计算某些文档中的属性值。例如,我们可以定义一个名为 age 的虚拟属性,计算出当前文档的年龄。

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

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

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

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

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

在这个示例中,我们计算出了当前文档的年龄。我们首先定义了一个 dateOfBirth 属性,然后使用虚拟属性计算并返回当前年龄(以年为单位)。

虚拟属性还可以与其他属性进行组合。我们也可以计算整个文档的大小并将其保存在虚拟属性中。

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

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

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

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

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

在这个示例中,我们使用虚拟属性计算文档的大小,并将其保存在 dataSize 虚拟属性中。这个虚拟属性是通过将文档的所有属性拼接起来计算出来的,并使用 Buffer.byteLength() 计算该字符串的大小。

虚拟参考字段

虚拟参考字段允许我们在不显式存储文档的情况下建立文档之间的关联。下面是一个简单的示例,在这个示例中,博客文章和评论被定义为两个不同的模型。每个博客文章可以有多个评论,我们可以使用虚拟参考字段来实现这个关系。

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

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

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

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

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

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

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

在这个示例中,我们通过定义 commentSchema.virtual() 方法来创建虚拟参考字段。我们指定了参考文档的模型(Blog),关联字段的本地字段(_id)和参考模型的外键(comments)。

使用虚拟参考字段,我们可以轻松地通过评论找到相应的文章。例如,在上面的示例中,我们可以通过访问 comment.blog 来查询文章,不需要显式地存储任何关系。

总结

虚拟属性和虚拟参考字段是 Mongoose 中强大的概念。虚拟属性允许我们计算文档的属性值,而虚拟参考字段允许我们在不显式存储文档之间的关系的情况下建立文档之间的关联。

我们通过实际示例说明了如何使用虚拟属性和虚拟参考字段。我们希望这些示例可以帮助您更好地理解这些概念,并在您的 Mongoose 项目中发挥作用。

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


猜你喜欢

  • Redis 中的哈希类型操作详解

    Redis 是一种高性能的内存数据库,其灵活的数据结构和快速的读写速度使其在大型应用程序中得到广泛使用。其中,哈希表是 Redis 中的一种重要数据类型,它允许在常数时间内对单个键存储和检索多个数据,...

    1 年前
  • Next.js 实战:Hexo 静态博客系统集成

    在前端开发领域,静态博客系统越来越流行。Hexo 是一款高效、快速、简洁的静态博客框架,它支持 Markdown 语法和丰富主题,使得博客的搭建非常简单。本文将介绍如何使用 Next.js 实现 He...

    1 年前
  • CSS Reset 常见误区及解决方案

    什么是 CSS Reset? 在开始为一个网站或者应用程序设计 CSS 样式时,我们会发现许多浏览器都具有自己的默认样式风格,这可能导致不同浏览器下显示的风格和效果不一致,甚至可能无法正常显示。

    1 年前
  • Promise doAdd 的 bug 分析及解决方式

    Promise 是 JavaScript 的一种异步编程模型。它可以有效地解决回调地狱(Callback Hell)的问题,使我们在开发中能够更加方便地处理异步操作。

    1 年前
  • TypeScript 如何使用 Express 进行 RESTful API 开发

    近年来,前端技术迅速发展,越来越多的项目需要使用前后端分离的架构。其中,RESTful API 已经成为前后端交互的标准。 在 TypeScript 中使用 Express 进行 RESTful AP...

    1 年前
  • Node.js 实战:使用 SSE 实现客户端与服务端实时通信

    在前端开发中,实时通信是一个非常重要的需求。为了满足这个需求,WebSockets 是一个非常流行的方案。但是 WebSockets 有些缺点,例如需要协商连接等,而这些协商过程是一些轻量级的通信场景...

    1 年前
  • Sequelize 如何使用 Op.between 实现范围查询

    在 Sequelize 中,可以使用操作符(Op)来进行各种查询操作。其中,Op.between 是一种非常常用的操作符,用于查询在指定范围内的数据。本文将详细介绍 Sequelize 如何使用 Op...

    1 年前
  • 如何在 VS Code 中自动修复您的 ESLint 错误

    在开发前端应用程序时,您可能经常使用 ESLint 来确保您代码的一致性和可读性。然而,人类并不总是完美的,您的代码中可能会出现 ESLint 错误。在这种情况下,手动修复错误非常麻烦和耗时。

    1 年前
  • 如何在 Deno 中实现 Restful API?

    Restful API 是现代 web 应用程序中广泛使用的一种 API 设计风格。Deno 作为一种现代 JavaScript 运行环境,提供了一种更加安全且可靠的方式来编写 Restful API...

    1 年前
  • 在 JS 中使用 import 来引入 CSS 的方法详解(webpack + babel)

    前端开发中,我们通常需要引入样式来美化网页。在传统的开发方式中,我们使用 <link> 标签将样式文件引入 HTML 中。然而现在,随着前端工程化的普及,我们使用 webpack + ba...

    1 年前
  • ECMAScript 2021 中的不变性 Proxy 对象详解

    随着 JavaScript 不断发展壮大,它在各种应用场景中都扮演着越来越重要的角色。在实践中,我们经常需要操作对象的属性或者函数,其中有些操作可能会对对象进行修改,这就给程序的维护带来了挑战。

    1 年前
  • Serverless 实现本地存储转云存储

    什么是 Serverless? Serverless 是一种云计算架构风格,其核心思想是让开发者专注于业务逻辑的实现而非底层基础设施的管理。相比于传统的云计算方式,Serverless 具有以下优势:...

    1 年前
  • 如何在浏览器中实现 GraphQL 查询

    前言 GraphQL 是一种用于API的查询语言和运行时环境。尽管它最初是由Facebook开发的,但它已经被许多不同的公司和组织采用。相对于REST API,GraphQL具有更好的可读性、可预测性...

    1 年前
  • 使用 Docker 快速搭建全栈监控平台

    在如今的云计算时代,Docker 已经成为前端开发的主流工具之一。它可以方便地打包、发布、运行和管理应用程序,使前端工程师们更加高效地进行开发、测试、部署。本文将介绍如何使用 Docker 快速搭建全...

    1 年前
  • Bootstrap 框架中实现响应式设计的最佳实践

    前言 响应式设计(Responsive Design)是一个当前非常流行的设计趋势。通过使用响应式设计,可以让我们的网站或应用在不同设备的屏幕上都能够良好地展示,而不需要为每个设备单独开发一个独立的版...

    1 年前
  • Node+Chai+Mocha 单元测试实战

    前言 前端开发中,单元测试是不可或缺的一环。它可以确保代码的正确性、可读性和稳定性,减少 Bug 的出现,提高代码的质量和可维护性。本文将介绍如何使用 Node、Chai 和 Mocha 实现前端单元...

    1 年前
  • React-Router 在 SPA 中的应用

    单页应用(Single Page Application,SPA)已经成为了现代 Web 开发的趋势,而 React-Router 就是 React 中最流行的路由解决方案之一,它能够帮助我们构建出高...

    1 年前
  • Angular 中实现响应式编程的 RxJS 操作符详解

    响应式编程(Reactive Programming)是一种编程范式,它可以帮助我们更好地处理事件流,可以帮助我们更好地管理异步操作,可以使我们的代码更加简洁和易于维护。

    1 年前
  • Fastify 和 Koa 比较:选择哪个更适合你?

    如果你正在寻找一个快速和高效的 Node.js Web 应用程序框架,你肯定听说过 Fastify 和 Koa。这两个框架都是非常流行的,但它们各自的设计理念、性能、易用性和功能方面都有所不同。

    1 年前
  • 使用 Jest 进行 Web 应用性能测试

    在现代 Web 应用开发中,性能测试被认为是非常重要的一部分。应用的性能直接影响着用户的体验和对产品的评价。在进行性能测试时,对于前端开发人员而言,需要考虑到浏览器的运行情况、网络环境和代码质量等因素...

    1 年前

相关推荐

    暂无文章