Mongoose 中使用虚拟属性和虚拟参考字段

在开发 Web 应用程序时,Mongoose 是一个非常强大的工具,它是一个通过 Node.js 操作 MongoDB 的工具。MongoDB 是一个文档数据库,而 Mongoose 将这些文档转换为 JavaScript 对象,这使得在应用程序中使用它们更加容易。其中的一个方面是虚拟属性和虚拟参考字段的使用,我们将在本文中探讨这些内容。

虚拟属性

虚拟属性是一些在模型中定义的属性,它们并不会存储在基础 MongoDB 数据库中,而是可以根据其他属性计算。虚拟属性有两种类型:计算属性和 Setter。

计算属性

计算属性是基于其他属性计算得到的属性。例如,考虑以下模型:

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

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

在这个模型中,我们可以定义一个虚拟属性 fullName,它将 firstNamelastName 组合成一个完整的名称:

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

在上面的代码中,我们通过 virtual() 方法定义了一个虚拟属性 fullName,它使用一个 getter 函数,该函数返回 firstNamelastName 的组合字符串。

现在,我们可以像访问普通属性一样访问 fullName 属性,即使它不在数据库中:

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

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

Setter 属性

Setter 属性允许我们将计算属性设置为模型中其他属性的值。例如,我们可以定义一个包含生日的模型,并计算出年龄虚拟属性:

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

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

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

在上面的代码中,我们使用 virtual() 方法定义了一个虚拟属性 age,通过 set() 方法设置了它的值。这个 setter 函数首先从传入的 Date 值中提取生日年份,并计算出当前年份与生日年份之间的差值。然后,它使用 set() 方法设置 age 属性和生日属性的值。

现在我们可以设置用户的年龄:

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

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

由于我们使用 setter 函数来设置 age 属性的值,这也会更新生日属性的值。

虚拟参考字段

虚拟参考字段是在 MongoDB 中使用 $lookup 操作符自动执行的类似外部关联字段。虚拟参考字段是可以根据关联的文档计算得到的字段,与虚拟属性不同的是,虚拟参考字段可以映射到自己的集合中其他文档。

由于实现虚拟参考字段需要涉及到关联操作,因此我们需要创建两个模型。这里我们假设有一个模型 User,和另一个模型 PostUser 模型有一个 _id 属性,并存储在 Post 文档中的 author 中。

现在,我们需要从 Post 模型中获取所有帖子,并将其与创建它们的用户关联起来。我们可以通过创建一个虚拟参考字段来实现这一点:

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

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

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

在上面的代码中,我们使用 virtual() 方法将 authorDetails 字段定义为虚拟参考字段。我们将 ref 属性设置为 User 模型,并使用 localFieldforeignField 属性将 author 属性与 _id 属性关联起来。

现在,我们可以使用 Mongoose 的 populate() 方法来对虚拟参考字段进行填充:

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

上面的代码中,我们调用 populate() 方法并传入 authorDetails 参数,这会填充虚拟参考字段,并将 User 文档添加到 authorDetails 属性中。

总结

通过使用 Mongoose 的虚拟属性和虚拟参考字段功能,我们可以创建一个更加灵活和可维护的数据库模型。计算属性和 Setter 属性可以根据其他属性自动生成值,而虚拟参考字段可以用于从多个集合中提取数据。这些特性不仅可以提高性能,还可以减少数据冗余,更好地组织代码。

参考示例代码如下:

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

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

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

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

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

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

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

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

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

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

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

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


猜你喜欢

  • Cypress测试SPA应用的完整流程

    在实际的项目开发中,前端测试是不可或缺的一环,在测试框架中,Cypress作为一个快速、可靠的端到端测试工具,被越来越多的开发人员所使用,本文将介绍Cypress测试SPA应用的完整流程,包括安装Cy...

    1 年前
  • 使用 Hapi 和 Angular 构建完整的 Web 应用程序

    前言 随着 Web 应用程序的普及,前端技术越来越重要。在前端开发中,使用合适的框架可以大大提高效率和可维护性。本文将介绍如何使用 Hapi 和 Angular 构建完整的 Web 应用程序。

    1 年前
  • 在 Deno 中使用 Axios 方法

    介绍 Deno 作为一个新的 JavaScript 运行时环境,提供了更加简单、安全和高效的开发体验,而 Axios 是一个流行的 HTTP 客户端库,可以在浏览器和 Node.js 等 JavaSc...

    1 年前
  • 在 Vue 项目中使用 ESLint 来提高代码质量

    在Vue项目中使用ESLint来提高代码质量 随着前端技术的不断发展,Vue已经成为了非常流行的一种前端框架。然而,即使使用Vue,我们也无法避免出现代码质量低下或者不规范等问题。

    1 年前
  • 响应式设计中使用 REM 单位的技术实现

    随着移动互联网普及,越来越多的用户使用各种不同的设备浏览网页。为满足不同设备的屏幕大小和分辨率的需求,响应式设计应运而生,它可以让同一个站点能够在不同的设备上自适应地展现不同的布局和样式。

    1 年前
  • Serverless 应用实现微信登录

    Serverless 是一种快速开发和部署应用的方法,通过将逻辑和基础设施的维护交给云服务提供商来节省开发者的时间和精力。微信登录是一个常用的认证方式,在 Serverless 应用中使用微信登录将用...

    1 年前
  • Fastify 应用部署到 Kubernetes 的教程

    Kubernetes 是一个开源的容器编排平台,可以帮助你管理运行在容器中的应用程序。Fastify 则是一个快速、低开销、功能齐全的 Node.js Web 框架。

    1 年前
  • Jest 的 Mock 函数在异步函数中的运用技巧

    在前端开发中,我们经常需要处理异步操作,例如向后端发送请求并且在接收到响应后更新 UI 界面。而在进行单元测试时,我们也需要模拟这种异步操作来保证代码的正确性。在 Jest 框架中,Mock 函数能够...

    1 年前
  • # ES9 中如何使用动态 import

    ES9 中如何使用动态 import 在 JavaScript 的最新版本 ES9 中,我们可以使用动态 import,它是一个异步导入模块的方法,它的返回值是一个 promise。

    1 年前
  • ECMAScript 2019: ES10 新特性解析

    随着时间的推移和技术的发展,前端技术也在不断变革和更新。ECMAScript 2019(也称为 ES10)是 JavaScript 的最新版本之一,于 2019 年 6 月发布。

    1 年前
  • Hadoop Map Reduce 作业性能优化指南

    在进行大规模数据处理时,Hadoop Map Reduce 是一个被广泛使用的分布式计算框架。然而,随着数据量的不断增大和业务需求不断增加,作业的性能优化变得更加重要。

    1 年前
  • Mongoose 中如何使用 BulkReplaceOne 方法进行批量替换

    在前端开发中,我们经常需要对数据库中的数据进行更新或者替换,而在 Mongoose 中则提供了 BulkReplaceOne 方法来实现对数据库中的数据进行批量替换。

    1 年前
  • LESS 资源引用的绝对和相对路径的转换

    LESS 是一种 CSS 预处理器,它提供了许多便于开发的语法和功能,其中资源引用是一个重要的功能。资源引用可以包括 CSS 文件、图片文件、字体文件等等,而引用方式可以使用绝对路径或者相对路径。

    1 年前
  • Headless CMS 如何处理分布式系统中的事务问题

    前言 随着越来越多的企业开始将其应用程序部署到分布式系统中,分布式应用程序的事务管理变得越来越重要。分布式系统中的事务问题是一个经典的问题,因为在这种环境下,两个或者多个系统之间的事务协调变得困难,这...

    1 年前
  • Material Design 中如何实现圆形进度条?

    在现代的网站和应用程序中,进度条是一个必不可少的元素之一,这是因为它可以让用户清楚地了解任务的进展情况。在 Material Design 中,圆形进度条是一种非常流行的进度条,它美观而且易于使用。

    1 年前
  • ECMAScript 2017 (ES8) 中 Object.values() 和 Object.entries() 方法的使用

    ECMAScript 2017(ES8)引入了两个新的 Object 对象方法 Object.values() 和 Object.entries()。这两个方法可以让我们更高效地处理对象的键值对数据,...

    1 年前
  • CSS Grid 如何支持各种浏览器

    随着前端技术的不断更新,CSS Grid 成为了前端开发者的新宠。它为页面的布局带来了更多的灵活性和自由度。但是,由于 CSS Grid 技术比较新,一些旧版的浏览器可能不支持该技术或者支持的方式不同...

    1 年前
  • Web Components 中实现图片懒加载的详细教程

    在现代网站中,图片通常是页面中占用最多宽度和高度的元素之一。然而,如果你在加载大量图片的页面中不进行必要的优化,那么你可能会遇到一个严重的问题:网站加载速度变慢,用户体验变糟糕。

    1 年前
  • CSS Flexbox 解决父级高度自适应问题

    在前端开发中,我们经常遇到父级元素高度不固定且需要适应子元素高度的情况。这时候,我们可以借助 CSS Flexbox 技术来轻松解决这个问题。 什么是 CSS Flexbox? CSS Flexbox...

    1 年前
  • Webpack 教程 - 个人总结

    Webpack 是一个前端工具,通过打包 JavaScript 应用程序、CSS 样式、图片、字体等文件,帮助开发者在开发过程中更高效地管理资源并提升性能。Webpack 的出现早在 2012 年,自...

    1 年前

相关推荐

    暂无文章