解决 Mongoose 中虚拟字段(virtual)不生效的问题

阅读时长 5 分钟读完

在使用 Mongoose 进行开发时,我们经常需要使用到虚拟字段(virtual)。虚拟字段是一种计算属性,其值不会被真正存储到数据库中,而是被从其他字段中计算出来。虚拟字段在开发中非常有用,可以节省存储空间,提高数据访问速度,同时还可以简化数据结构。

然而,有些开发者在使用 Mongoose 的虚拟字段时,会遇到一些问题。例如,有时虚拟字段不生效,或者无法正确地计算出其值。本文将介绍如何解决 Mongoose 中虚拟字段不生效的问题,并提供一些示例代码。

问题描述

在 Mongoose 中,我们可以使用以下代码定义一个虚拟字段:

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

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

在上面的代码中,我们定义了一个名为 fullName 的虚拟字段,该字段的值是由 firstName 和 lastName 拼接而成的。现在,我们创建一个 Person 模型,并保存一条数据:

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

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

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

在保存了数据后,我们通过 console.log 打印了 doc.fullName 的值,但是发现其值为 undefined。这是一个很奇怪的问题,因为我们已经正确地声明了虚拟字段,但却无法获取其值。

问题分析

出现这个问题的原因是,Mongoose 在默认情况下不会将虚拟字段的值包含在其返回结果中。虽然虚拟字段不属于模型实例的真实属性,但他们是 Model#get() 的一部分。如果您调用模型的toJSON方法或调用JSON.stringify,Mongoose则将调用模型的toObject方法,该方法使用虚拟字段。

因此,如果想要获取虚拟字段的值,我们需要进行一些额外的步骤来告诉 Mongoose 包含这些字段的值。

解决方法

为了让 Mongoose 正确返回虚拟字段的值,我们需要按照下面的步骤进行操作:

  1. 可以在 Schema 中使用 toObject 选项,将 getters 设置为 true,将 virtuals 设置为 true,以包含虚拟字段的值。
  1. 可以在查询数据时,使用 lean() 方法,将结果转化成 JavaScript 对象。此时,虚拟字段的值也会被包含在对象中。

注意,在使用 lean() 方法时,返回的对象是 JavaScript 原生的对象,不是 Mongoose 的文档对象。因此,无法像文档对象那样调用其方法。

完整示例代码:

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

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

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

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

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

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

总结

在 Mongoose 中使用虚拟字段时,遇到虚拟字段不生效的问题,是一个比较常见的问题。该问题主要是因为 Mongoose 在默认情况下不会返回虚拟字段的值,需配置 toJSON 和 toObject 选项或使用 lean() 方法才能包含虚拟字段的值。

对于开发人员而言,理解虚拟字段的概念以及如何使用和管理虚拟字段,对于提高开发效率和优化代码结构非常有帮助。因此,理解虚拟字段的工作原理,以及解决虚拟字段不生效的问题是非常重要的一步,也是学习 Mongoose 开发的重要内容。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649791df48841e989448f458

纠错
反馈