在使用 Mongoose 进行开发时,经常需要处理一些与当前模型实例的属性值相关的计算逻辑,这时候就可以用到 Mongoose 的虚拟属性(virtuals)。本文将详细介绍 Mongoose 中的虚拟属性及其使用场景,并给出示例代码。
什么是虚拟属性(virtuals)?
虚拟属性是一种 Mongoose 中的属性,它不是真正存在于数据库中的属性,而是通过在模式中定义 getter 和 setter 方法来实现的。在从数据库中查询到数据后,Mongoose 会自动运行 getter 方法,并将结果放入模型的属性中返回。虚拟属性在实际应用中的使用场景非常多,下面将介绍其几个经典场景。
虚拟属性的使用场景
联表查询
在某些情况下,我们需要将两个或以上的表进行联表查询,并将查询结果进行计算和处理。这时候就可以用到虚拟属性。以查询城市和国家信息为例,在 City 模型中定义虚拟属性“country”,使用 ref 属性将其关联到 Country 模型中,并通过 getter 方法获取关联文档的信息。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------ - ---------------- ----- ------------- - --- -------- ----- ------- --- ----- ---------- - --- -------- ----- ------- -------- - ----- ---------------------- ---- --------- - --- --------------------------------- - ---- ---------- ----------- ---------- ------------- ------ -------- ----- -------- -- --- -------------- - - -------------- ---------- --
这时候就可以在查询城市信息时,通过 countryInfo 虚拟属性获取城市所属国家的信息。
const city = await City.findById(id).populate('countryInfo'); console.log(city.countryInfo.name); // 输出国家名称
动态计算属性值
在有些时候,我们需要将某些属性值进行复杂的计算,以满足特定的业务需求。此时可以使用虚拟属性来实现。例如,我们需要计算文章的阅读量和点赞数。可以在 Article 模型中定义虚拟属性,“readCount”和“likeCount”,并通过 setter 和 getter 方法实现自动计算。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------ - ---------------- ----- ------------- - --- -------- ------ ------- -------- ------- ---------- ------- ---------- ------- --------- ---- --- ---------------------------------- - ----- - -- ---------------------- -- ------ ----- ------------- ------ --------------- -- -- -- ---------- - -- ------------------------ ----- -- --------------- - ------ - --- ---------------------------------- - ----- - -- ---------------------- -- ------ ----- ------------- ------ --------------- -- -- -- ---------- - -- ------------------------ ----- -- --------------- - ------ - --- -------------- - - ------------- --
通过这样的方式,我们就可以方便地对文章的阅读量和点赞数进行计算和更新。
统计数据
在某些情况下,我们需要对模型中的数据进行统计,例如某个时间段内的销售额、总订单数等等。此时,可以使用虚拟属性来实现。以订单模型为例,我们可以定义一个虚拟属性“salesTotal”,通过 getter 方法,查询某个时间段内的订单和订单项数据,并计算得出该时间段内的销售额。
-- -------------------- ---- ------- ----- --------------- - --- -------- -------- - ----- ---------------------- ---- ---------- -------- ---- -- --------- - ----- ------- ---- -- -------- ---- -- ------ - ----- ------- ---- ----- -------- ---- - --- ----- ----------- - --- -------- ------ ------------------ --------- ---- --- ------------------------------------------------ - ----- --------- - --- ---------- -- --- ----- ------- - --- ---------- -- ---- ----- ----- - ------------------------ -- - ------ ---------- -- --- ------------------- -- --------- -- --- ------------------- -- -------- --------------- ----- -- - ------ --- - ---------- - -------------- -- --- ------ ------ --- -------------- - - ----------- --
这样就可以通过查询订单模型,并调用 salesTotal 虚拟属性,轻松地获取所需的销售统计数据。
总结
本文介绍了 Mongoose 中的虚拟属性及其使用场景,包括联表查询、动态计算属性值和统计数据。使用虚拟属性可以方便地处理模型中的计算逻辑,减少代码中的冗余和复杂性。希望本文能够对熟悉 Mongoose 的开发者提供一些指导和帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648c052a48841e9894a4fbc6