Mongoose 中 schema 的 virtual 解决方法

在使用 Mongoose 进行 MongoDB 数据库操作的时候,我们通常会使用 schema 来定义数据模型。而在 schema 中,我们可以使用 virtual 来创建虚拟的属性,这些属性不会被保存到数据库中,但是可以在查询结果中返回。

然而,在使用 virtual 的过程中,可能会遇到一些问题,比如无法在 populate 中使用,或者在 toJSON 转换时无法输出。本文将介绍 Mongoose 中 schema 的 virtual 解决方法,帮助你更好地使用 virtual。

问题描述

在使用 virtual 的时候,可能会遇到下面两个问题:

  1. 无法在 populate 中使用
  2. 在 toJSON 转换时无法输出

下面分别介绍这两个问题的解决方法。

无法在 populate 中使用

在使用 populate 查询时,如果要查询的字段是 virtual 字段,那么查询结果中就不会包含这个字段。例如:

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

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

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

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

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

在上面的代码中,我们定义了一个虚拟的 fullName 字段,并且在 populate 中查询 author 字段的 fullName 属性。但是,输出的结果中并没有 fullName 字段。

这是因为 populate 查询是通过 MongoDB 的聚合操作实现的,而 virtual 字段并不是真正的字段,无法被聚合操作获取。为了解决这个问题,我们需要使用 Mongoose 的 toObject 和 toJSON 转换方法。

在 toJSON 转换时无法输出

在使用 toJSON 方法将 Mongoose 对象转换为 JSON 格式时,虚拟字段也无法被输出。例如:

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

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

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

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

在上面的代码中,我们定义了一个虚拟的 summary 字段,并且将 Post 对象转换为 JSON 格式输出。但是,输出的结果中并没有 summary 字段。

这是因为 toJSON 方法默认只输出 schema 中定义的字段,而不包括 virtual 字段。为了解决这个问题,我们需要在 schema 中添加一个选项,将 virtual 字段也包含进来。

解决方法

为了解决上面的两个问题,我们需要在 schema 中添加一个选项:toObjecttoJSONvirtuals 属性。

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

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

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

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

在上面的代码中,我们在 schema 的选项中添加了 toJSONtoObjectvirtuals 属性,将 virtual 字段也包含进来。现在,再次运行代码,就可以看到输出结果中包含了 summary 字段。

另外,在使用 populate 查询时,我们也需要将 virtual 字段添加到查询结果中:

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

在上面的代码中,我们将 populate 方法的第二个参数改为 'fullName -_id',这样就可以查询到 author 的 fullName 字段了。

总结

在使用 Mongoose 中的 virtual 字段时,我们可能会遇到无法在 populate 中使用和在 toJSON 转换时无法输出的问题。为了解决这个问题,我们需要在 schema 中添加 toJSONtoObjectvirtuals 属性,将 virtual 字段也包含进来。另外,在使用 populate 查询时,也需要将 virtual 字段添加到查询结果中。

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


猜你喜欢

  • 如何在 MongoDB 中使用聚合进行分组操作

    MongoDB 是一个非关系型数据库,它的数据存储方式是文档型的,可以存储复杂的数据结构。在实际应用中,我们经常需要对存储在 MongoDB 中的数据进行聚合分析,例如分组统计、求平均值、求最大值等操...

    10 个月前
  • Kubernetes 中 DaemonSet 的使用及优化实践

    在 Kubernetes 中,DaemonSet 是一种用于在集群中部署守护进程的控制器。它能够确保在集群中每个节点上都运行一个 Pod,从而保证集群中的某些服务或应用能够持续运行。

    10 个月前
  • ECMAScript 2019 中的 flat 和 flatMap 方法解析

    在 ECMAScript 2019 中,JavaScript 新增了两个数组方法:flat 和 flatMap。这两个方法都是用于处理嵌套数组的,而且它们都返回一个新的数组。

    10 个月前
  • Mocha 测试框架中如何测试跨域 API

    什么是 Mocha 测试框架 Mocha 是一款 JavaScript 测试框架,它可以运行在 Node.js 和浏览器中。它是一个功能齐全的测试框架,支持异步测试、前端和后端测试、BDD 和 TDD...

    10 个月前
  • 如何解决 TypeScript 中的变量类型问题

    TypeScript 是一种由微软开发的静态类型检查的 JavaScript 超集。它通过引入类型系统,可以在编译时捕获常见的错误,提高代码质量和可维护性。但是,在实际开发中,我们经常会遇到变量类型问...

    10 个月前
  • 使用 PM2 进行 Node.js 的性能优化

    Node.js 是一种非常流行的后端开发语言,它的高效性和灵活性使得它在许多领域得到了广泛的应用。然而,随着 Node.js 应用规模的逐渐扩大,性能问题也逐渐显现出来。

    10 个月前
  • GraphQL 与 RESTful API 的比较分析

    在前端开发中,API 是非常重要的一部分,而 RESTful API 是最常见的一种 API 设计风格。然而,最近出现了一种新的 API 设计标准,叫做 GraphQL。

    10 个月前
  • 使用 ES8 中的 padStart() 和 padEnd() 处理字符串长度不足的情况

    在前端开发中,处理字符串长度不足的情况是一个常见的问题。在 ES8 中,新增了 padStart() 和 padEnd() 方法,可以很方便地解决这个问题。 什么是 padStart() 和 padE...

    10 个月前
  • 如何利用 CSS Reset 实现图片圆角效果

    在前端开发中,图片圆角效果是常见的设计要求之一。而实现图片圆角效果的方式有很多种,其中一种比较简单的方式是利用 CSS Reset。 什么是 CSS Reset? CSS Reset 是一种用于重置浏...

    10 个月前
  • RxJS mapTo 和 pluck 操作符的使用区别

    在 RxJS 中,有两个常用的操作符:mapTo 和 pluck。它们的作用是对 Observable 中的数据进行转换和提取。在使用这两个操作符时,可能会有一些混淆,因此本文将详细介绍这两个操作符的...

    10 个月前
  • Vue SSR 中如何使用 Webpack 进行代码分割

    在 Vue SSR(服务端渲染)中,我们可以使用 Webpack 进行代码分割以提高页面加载速度和性能。本文将介绍如何使用 Webpack 进行代码分割,并提供详细的示例代码。

    10 个月前
  • Material Design 中 Snackbar 的基本使用教程

    Material Design 是 Google 推出的一套 UI 设计语言,旨在为 Android 设备和 Web 应用程序提供一致的视觉和交互体验。Snackbar 是 Material Desi...

    10 个月前
  • 使用 Less 实现按钮的各种样式效果

    前端开发中,按钮是一个非常常见的 UI 组件。为了让按钮更加美观、多样化,我们可以使用 Less 来实现各种样式效果。本文将介绍如何使用 Less 实现按钮的各种样式效果,包括颜色、大小、形状、阴影等...

    10 个月前
  • Node.js 中如何实现搜索功能?

    随着互联网的发展,搜索功能已经成为了现代网站的必备功能之一。在 Node.js 中,实现搜索功能并不难,本文将为大家介绍如何使用 Node.js 实现搜索功能。 1. 确定搜索需求 在实现搜索功能之前...

    10 个月前
  • Babel7 如何在项目中使用 decorators 语法

    Babel7 如何在项目中使用 decorators 语法 在现代的前端开发中,使用装饰器(decorators)语法已经成为了一种常见的编程方式。装饰器可以方便地给类和方法添加额外的功能,使得代码更...

    10 个月前
  • 实践中常见的 Flexbox 问题及解决方案

    Flexbox 是 CSS3 中一种强大的布局模式,它可以轻松地实现各种复杂的布局效果,而不需要使用传统的浮动和定位技术。然而,在实践中,我们可能会遇到一些常见的 Flexbox 问题,本文将介绍这些...

    10 个月前
  • PWA 中的页面加载速度优化:预加载和懒加载的使用方法

    随着移动设备的普及,越来越多的用户喜欢通过手机浏览器访问网站。然而,由于移动网络的不稳定性,页面加载速度成为了一个非常重要的问题。为了提高用户体验,前端开发人员需要尽可能地优化页面加载速度。

    10 个月前
  • 浅析 ES9 中的 Object.keys() 方法和 Object.values() 方法

    在前端开发中,我们经常需要对对象进行操作,比如获取对象的属性、修改对象的属性等等。ES9 中新增的 Object.keys() 方法和 Object.values() 方法可以帮助我们更方便地对对象进...

    10 个月前
  • 使用 Headless CMS 创建个性化内容:解决实现问题的最佳实践

    随着互联网的发展,网站的内容已经不再是简单的文字和图片,而是需要更多的个性化和定制化。为了实现这些需求,前端开发人员需要使用一些工具和技术来创建和管理网站的内容。其中,Headless CMS 是一个...

    10 个月前
  • 如何让你的 Vue SPA 不仅仅局限于单页面

    Vue 是一个非常流行的 JavaScript 前端框架,可以帮助开发者快速构建单页面应用(SPA)。然而,有时候我们可能需要在 Vue SPA 中添加多个页面,而不是只有一个页面。

    10 个月前

相关推荐

    暂无文章