Mongoose 中文文档虚拟属性详解

在 MongoDB 的 Node.js 驱动 Mongoose 中,虚拟属性是一种模式属性,在对文档进行查询或者保存时会自动进行计算或者转换,但它不会在 MongoDB 中存储。这种特性在很多场景下非常有用,它可以给抽象属性和逻辑增加一个新的维度。

基本概念

在 Mongoose 中,虚拟属性的定义非常简单,我们可以通过在 Schema 中调用 virtual() 方法来声明一个虚拟属性。下面是一个示例:

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

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

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

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

可以看出,虚拟属性并不存储在 MongoDB 中,而是在运行时(取值时)计算得到。虚拟属性有两种类型:gettersetter,它们分别对应着一个属性值的读取和设置。

虚拟属性类型

Getter

Getter 是一个没有 setter 的虚拟属性类型。当我们在代码中访问该属性时,Mongoose 会执行 get 函数来获取该值。我们可以使用 get 函数返回计算过的值,也可以利用它进行一些复杂的运算、逻辑判断等处理。

下面的例子展示如何计算一个用户文档的年龄:

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

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

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

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

Getter 虚拟属性有一个非常重要的特性,它们可以通过虚拟属性计算,这对于需要频繁执行复杂计算的情况非常有用。而且 Getter 属性的计算可以依赖其他属性,方便我们进行维护和修改。

Setter

Setter 是一个没有 getter 的虚拟属性类型。当我们在代码中设置该属性时,Mongoose 会执行 set 函数,并返回一个新的属性值。Setter 有一个非常重要的作用,它可以用来将外部数据格式化为符合 Schema 规范的格式。

下面的例子展示了一个字符串去除空格的 setter:

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

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

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

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

这个 setter 可以用来格式化一个消息,也可以用来进行格式校验或转换。Setter 属性还有一个重要的应用场景,就是用来处理外部 API 或者用户输入的数据,保证数据都符合指定格式。

虚拟属性选项

ref

在 Mongoose 中,虚拟属性可以通过 ref 选项关联到其他文档,从而实现文档间关联。ref 选项用来指定被关联文档的 model,支持 string 形式和 objectid 形式。

下面的例子展示了如何在 Mongoose 中关联两个文档:

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

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

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

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

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

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

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

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

这个例子展示了如何通过虚拟属性 ref 将 Customer 和 Order 关联起来。我们使用 localFieldforeignField 选项分别指定了关联的本地字段和外部字段。这样,我们就可以在查询 Customer 时直接获取它的订单列表。

localField 和 foreignField

在 ref 选项中,我们使用了两个额外的选项:localFieldforeignField。它们描述了两个文档间关联的字段。

  • localField:用于指定本 model(即虚拟属性所属的 model)中用于与外部 model 进行关联的字段名称。默认值为 '_id'。

  • foreignField:用于指定与外部 model 关联的字段名称(即外部 model 中要关联的字段)。默认值为 '_id'。

在关联两个文档时,我们经常需要在查询时使用 populate() 方法,这个方法可以将虚拟属性关联的文档一并查询出来,从而避免了多次查询带来的性能损失。

总结

虚拟属性是 Mongoose 中非常有用的功能,它可以用来处理文档间的关联、逻辑计算和数据格式转换等问题。在使用虚拟属性时,需要特别注意一些选项(如 reflocalFieldforeignField),以及虚拟属性类型(如 getter 和 setter)的区别。同时,还需要充分理解虚拟属性的特性和使用场景,以便更好的利用它们。

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


猜你喜欢

  • 使用 ASP.NET Core 和 SignalR 实现 Server-Sent Events

    Server-Sent Events (SSE) 是一种在 Web 应用程序中实现服务器向客户端推送事件的技术。使用 SSE 技术,可以通过简单的 HTTP 连接实时向客户端发送事件和消息。

    1 年前
  • MongoDB 读写性能变差,该如何处理?

    背景 MongoDB 是当前十分流行的 NoSQL 数据库之一,它具有高速、灵活、可扩展性强等优点,在前端项目中被广泛应用。然而,若数据量逐渐增加,读写性能却有可能急剧下降,这将影响后续业务的开展,所...

    1 年前
  • 解决 Next.js 在 Heroku 上的 404 问题

    引言 Next.js 是一款非常流行的 React 框架,它可以帮助我们快速构建基于 React 的 SSR 应用程序。Heroku 是一个流行的云平台,它可以帮助开发者轻松地将应用程序部署到云端。

    1 年前
  • 使用 Fastify 和 Socket.io 构建实时聊天

    前言 实时聊天是现代化的应用程序设计中不可或缺的特性。然而,要实现实时聊天的功能是挑战性的,因为它需要不仅仅是一个可靠的通讯协议,还需要一个高效的框架来处理网络请求和事件。

    1 年前
  • Deno 中使用 GraphQL 构建 API 的实例解析

    GraphQL 是一种查询语言,用于 API 的设计和查询。在 Web 开发中,GraphQL 已经成为了一个受欢迎的 API 解决方案。而 Deno 则是一个新兴的 JavaScript 运行时,通...

    1 年前
  • 在 SPA 应用中使用 Axios 实现数据请求和响应拦截

    随着前端技术的飞速发展,单页面应用(SPA)已经成为了一种主流形式。SPAs 具有许多优点,例如快速响应时,保持页面状态,减少服务器压力等。为了与服务器交互数据,我们需要使用一些库和框架来进行网络请求...

    1 年前
  • 为什么需要使用 CSS Reset?

    作为前端开发者,你一定遇到过浏览器样式兼容的问题。虽然每个浏览器都有自己的默认样式,但它们的差异可能会导致网页展示效果不同。为了解决这个问题,我们需要使用 CSS Reset。

    1 年前
  • Cypress 如何进行访问控制的测试?

    在前端开发过程中,我们经常需要进行访问控制的测试,以确保用户只能访问自己被授权的资源。Cypress 是一个流行的前端测试框架,支持编写自动化测试用例,可以帮助我们快速构建测试套件,自动化执行测试用例...

    1 年前
  • 基于 Web Components 的应用程序的扩展功能

    在前端开发过程中,经常需要通过不同的组件和插件来扩展应用程序的功能,但是这些组件和插件往往是针对特定的框架或库而设计的,限制了它们的复用和搭配性。为了解决这个问题,Web Components 作为一...

    1 年前
  • 如何在 Custom Elements 中使用 Web Components 标准?

    如何在 Custom Elements 中使用 Web Components 标准? 在现代的 Web 开发中,Web 组件已经成为了一个很重要的概念。它们通过 Web Components 标准为我...

    1 年前
  • Chai 中 expect 的使用教程

    前言 在前端开发中,写测试用例是非常重要的。通过测试用例,我们可以验证代码的正确性、稳定性和可用性,从而提升代码质量和开发效率。 在测试用例中,断言(Assertion)是核心。

    1 年前
  • ES9 之 Object.getOwnPropertyDescriptors() 使用指南

    在 ES9 中,引入了一个新的方法 Object.getOwnPropertyDescriptors(),用来获取对象属性的完整描述符。本文将详细介绍该方法的使用以及其在前端开发中的应用。

    1 年前
  • RxJS 中的 groupBy 和 partition 操作符

    本文将介绍 RxJS 中的 groupBy 和 partition 操作符,并详细说明它们的用法和意义,帮助前端开发者更好地理解和应用 RxJS。 RxJS 简介 RxJS 是一个基于可观察序列的函数...

    1 年前
  • 在 Bootstrap 和 Tailwind 之间做出正确的选择

    众所周知,Bootstrap 和 Tailwind 都是前端类的 UI 框架,具有巨大的用户群体和广泛的应用范围。但是,对于初学者来说,选择适合自己的框架时往往会犯一些错误。

    1 年前
  • 如何使用 CSS Grid 实现圣杯布局?

    CSS Grid 是最新的一种布局方式,它为前端开发者提供了更加灵活和强大的布局能力。圣杯布局也是前端开发中难度较高的一种布局方式,但是使用 CSS Grid 可以更加方便地实现这种布局。

    1 年前
  • SASS 的函数库:Bourbon 的使用方法和注意事项

    在前端开发中,CSS 是我们经常需要编写的一种语言。而 SASS 是一个非常流行的 CSS 预处理器,它可以大大简化我们的样式表代码,提高我们的开发效率。 Bourbon 是 SASS 的一个函数库,...

    1 年前
  • Sequelize 数据迁移的步骤详解

    Sequelize 是一个 Node.js 的 ORM(Object-Relational Mapping)框架,可以方便地操作数据库。数据迁移是一个重要的技术,它可以方便地将现有的数据库结构转移到新...

    1 年前
  • Redux 中的性能优化技巧

    Redux 是一种流行的状态管理库,广泛应用于 React 应用程序中。它是一种可靠、可扩展的架构模式,能够简化应用程序的状态管理。虽然 Redux 提供了许多有用的功能,但是随着应用程序规模的扩大,...

    1 年前
  • 如何利用 ES8 的 async/await 实现多个 promise 同时并发执行

    随着前端技术的发展,异步编程已成为前端开发中不可避免的部分,而 Promise 是异步编程中常见的解决方案之一。ES8(也称为 ECMAScript 2017)引入了 async/await 这一语言...

    1 年前
  • ECMAScript 2021 中的新模板字面量功能:让模板更精简

    随着前端技术的不断发展,JavaScript 也在不断的更新迭代,并添加新的功能和语法,让开发者能够更加高效地进行开发。在 ECMAScript 2021 中,引入了新的模板字面量(Template ...

    1 年前

相关推荐

    暂无文章