在使用 Mongoose 进行开发时,我们经常需要使用到虚拟字段(virtual)。虚拟字段是一种计算属性,其值不会被真正存储到数据库中,而是被从其他字段中计算出来。虚拟字段在开发中非常有用,可以节省存储空间,提高数据访问速度,同时还可以简化数据结构。
然而,有些开发者在使用 Mongoose 的虚拟字段时,会遇到一些问题。例如,有时虚拟字段不生效,或者无法正确地计算出其值。本文将介绍如何解决 Mongoose 中虚拟字段不生效的问题,并提供一些示例代码。
问题描述
在 Mongoose 中,我们可以使用以下代码定义一个虚拟字段:
-- -------------------- ---- ------- ----- ------------ - --- -------- ---------- ------- --------- ------ --- -------------------------------- --------------- - ------ -------------- - - - - -------------- ---
在上面的代码中,我们定义了一个名为 fullName 的虚拟字段,该字段的值是由 firstName 和 lastName 拼接而成的。现在,我们创建一个 Person 模型,并保存一条数据:
-- -------------------- ---- ------- ----- ------ - ------------------------ -------------- ----- ------ - --- -------- ---------- ------- --------- ----- --- ----------------- ---- -- - -------------------------- -- --------- ---
在保存了数据后,我们通过 console.log 打印了 doc.fullName 的值,但是发现其值为 undefined。这是一个很奇怪的问题,因为我们已经正确地声明了虚拟字段,但却无法获取其值。
问题分析
出现这个问题的原因是,Mongoose 在默认情况下不会将虚拟字段的值包含在其返回结果中。虽然虚拟字段不属于模型实例的真实属性,但他们是 Model#get() 的一部分。如果您调用模型的toJSON
方法或调用JSON.stringify
,Mongoose则将调用模型的toObject
方法,该方法使用虚拟字段。
因此,如果想要获取虚拟字段的值,我们需要进行一些额外的步骤来告诉 Mongoose 包含这些字段的值。
解决方法
为了让 Mongoose 正确返回虚拟字段的值,我们需要按照下面的步骤进行操作:
- 可以在 Schema 中使用
toObject
选项,将getters
设置为true
,将virtuals
设置为true
,以包含虚拟字段的值。
const personSchema = new Schema({ firstName: String, lastName: String }, { toJSON: { getters: true, virtuals: true }, toObject: { getters: true, virtuals: true } });
- 可以在查询数据时,使用
lean()
方法,将结果转化成 JavaScript 对象。此时,虚拟字段的值也会被包含在对象中。
Person.findOne({ firstName: 'John' }).lean().exec((err, doc) => { console.log(doc.fullName); // 'John Doe' });
注意,在使用 lean()
方法时,返回的对象是 JavaScript 原生的对象,不是 Mongoose 的文档对象。因此,无法像文档对象那样调用其方法。
// 报错,因为 lean() 后返回的是 JavaScript 对象,而不是文档对象 doc.save();
完整示例代码:
-- -------------------- ---- ------- ----- ------------ - --- -------- ---------- ------- --------- ------ -- - ------- - -------- ----- --------- ---- -- --------- - -------- ----- --------- ---- - --- -------------------------------- --------------- - ------ -------------- - - - - -------------- --- ----- ------ - ------------------------ -------------- ----- ------ - --- -------- ---------- ------- --------- ----- --- ----------------- ---- -- - -------------------------- -- --------- --- ---------------- ---------- ------ -------------------- ---- -- - -------------------------- -- ----- ---- ---
总结
在 Mongoose 中使用虚拟字段时,遇到虚拟字段不生效的问题,是一个比较常见的问题。该问题主要是因为 Mongoose 在默认情况下不会返回虚拟字段的值,需配置 toJSON 和 toObject 选项或使用 lean() 方法才能包含虚拟字段的值。
对于开发人员而言,理解虚拟字段的概念以及如何使用和管理虚拟字段,对于提高开发效率和优化代码结构非常有帮助。因此,理解虚拟字段的工作原理,以及解决虚拟字段不生效的问题是非常重要的一步,也是学习 Mongoose 开发的重要内容。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649791df48841e989448f458