在使用 Mongoose 进行开发时,我们经常会遇到需要为 Schema 添加虚拟属性的场景。虚拟属性本质上并不是数据库中的字段,而是由 Mongoose 触发函数生成的属性。虚拟属性可以让我们方便地获取或操作数据,本文将详细介绍 Mongoose 中的虚拟属性,为你提供深度学习和指导意义。
1. 定义虚拟属性
Mongoose 提供了 Schema
构造函数的 virtual
方法来定义虚拟属性。下面是一个例子:
-- -------------------- ---- ------- ----- ------ - --- ----------------- ----- - ----- ------- --------- ---- -- ---- - ----- ------- --------- ---- - --- -------------------------------------------- - ------ ------------- --------------- ---
在这个例子中,我们定义了一个 displayName
的虚拟属性,它由 name
和 age
两个属性拼接而成。virtual
方法的第一个参数是属性名,第二个参数是包含 get
和 set
方法的对象。在上面的例子中,我们只定义了 get
方法,所以 displayName
属性是只读的。
当我们获取数据时,虚拟属性将自动生成并返回。下面是一个例子:
const User = mongoose.model('User', schema); User.findOne({ name: 'Bob' }, (err, user) => { console.log(user.displayName); // Bob (25) });
2. 使用虚拟属性
虚拟属性和普通属性一样可以在查询、更新等操作中使用。在查询数据时,我们可以借助 populate
方法将虚拟属性填充到结果对象中。下面是一个例子:
-- -------------------- ---- ------- ----- ----------- - --- ----------------- ----- - ----- ------------------------------- ---- ------- --------- ---- -- ------ - - ----- ------------------------------- ---- ---------- --------- ---- - -- ---------- - ----- ----- --------- ----- -------- -------- - --- ------------------------------------------- - ------ ------------------------- ----- -- ----- - ----------- --- --- ----- ----- - ----------------------- ------------- ----- ------ - ----- ------------------------------ ----------------------------- -- ----
在上面的例子中,我们定义了 OrderSchema
,包含了一个 total
的虚拟属性。我们使用 populate
方法将 user
对象和其关联的订单都填充到结果对象中,从而能够使用关联对象的虚拟属性。
3. 设置虚拟属性
虚拟属性的 set
方法用于设置值,它接受一个参数,表示属性的值。在设置虚拟属性时需要注意两点:
- 不能使用
Schema
构造函数的save
方法保存虚拟属性,因为虚拟属性并不是数据库中的字段。 - 在设置虚拟属性时需要同时设置关联字段的值(如果有)。
以下是一个设置虚拟属性的例子:
schema.virtual('password').set(function(value) { this.salt = bcrypt.genSaltSync(10); this.hash = bcrypt.hashSync(value, this.salt); }); user.password = '123456'; user.save();
在这个例子中,我们定义了 password
的虚拟属性,设置它的值时会自动计算 salt
和 hash
的值。由于虚拟属性并不是数据库中的字段,所以在保存数据时需要单独设置 salt
和 hash
的值。
4. 总结
本文详细介绍了 Mongoose 中的虚拟属性,并提供了示例代码帮助你深度学习和理解。虚拟属性是 Mongoose 中一个比较方便的特性,可以让我们轻松地获取或操作数据。如果你遇到了使用虚拟属性的问题,可以参考本文提供的内容,希望能对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64559f64968c7c53b09118da