在使用 Mongoose 进行 MongoDB 操作时,有时需要在文档数据中加入一些计算得出的属性,这些属性不需要实体化保存在 MongoDB 中,但是需要在前端使用时加以计算。这时候,我们可以使用虚拟属性来达到这个目的。
什么是虚拟属性
虚拟属性是指在 Mongoose 模型中定义的、不存储在 MongoDB 中的属性。虚拟属性通常用于计算和获取文档数据的其他属性。
如何定义虚拟属性
在 Mongoose 模型中定义虚拟属性,只需要在 Schema 中使用 virtual 方法即可。例如,我们需要添加一个虚拟属性 fullName
,那么可以这样定义 Schema:
const userSchema = new Schema({ firstName: String, lastName: String }); userSchema.virtual('fullName').get(function() { return this.firstName + ' ' + this.lastName; });
上面的代码中,我们定义了一个 fullName
属性,并使用 get
方法定义了它的计算规则。在使用 fullName
属性时,Mongoose 会自动调用 get
方法进行计算。
同时,虚拟属性也可以使用 set
方法来设置属性值。例如,我们需要根据 fullName
的值设置 firstName
和 lastName
:
userSchema.virtual('fullName').set(function(name) { const [firstName, lastName] = name.split(' '); this.firstName = firstName; this.lastName = lastName; });
在使用 fullName
属性时,Mongoose 会自动调用 set
方法来设置 firstName
和 lastName
。
虚拟属性的应用场景
虚拟属性的应用场景非常广泛,例如:
- 模型中需要计算得出的属性,比如总价格、折扣等
- 模型中需要获取其他文档数据,比如一个用户文档需要获取该用户的所有订单数据
- 前端需要使用的属性,比如用户的头像地址,可以通过计算得出
示例
以下是一个订单模型的示例,使用了虚拟属性来计算订单中的总价:
-- -------------------- ---- ------- ----- ----------- - --- -------- ------ -- -------- ------ ---------------------- ---- ----------- --------- ------ -- --- ------------------------------------------- - --- ----- - -- ----------------------- -- - ----- -- ------------------ - -------------- --- ------ ------ --- ----- ----- - ----------------------- ------------- ----- ----- - --- ------- ------ - --------- --------------------------- --------- --- --------- --------------------------- --------- -- - --- ------------------------- -- --
在上面的示例中,我们定义了一个 total
虚拟属性,它计算了订单的总价。在创建订单实例后,我们可以直接使用 order.total
进行获取。在获取 total
时,Mongoose 会自动调用 get
方法来计算总价。
总结
虚拟属性是 Mongoose 中非常实用的功能,它可以方便地实现模型中的部分属性的计算和获取,同时不需要占用 MongoDB 中的存储空间。在开发中,我们可以灵活地运用虚拟属性,为我们的项目带来更加高效和舒适的开发体验。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649ad7c848841e98947c7838