在 Mongoose 中,虚拟属性是一个基于模型定义的衍生属性。与模型中真实存储的属性不同,虚拟属性中不会被保存到数据库中。相反,它们由运行时提供或由其他属性计算。
Mongoose 的虚拟属性提供了一种易于使用的方法来处理模型数据。在本篇文章中,我们将深入了解 Mongoose 中的虚拟属性使用方法及其优势。
使用虚拟属性的优势
- 与真实属性相似性质,虚拟属性需要定义数据类型、默认值,并与真实属性一样地进行验证。
- 虚拟属性可以通过特定的 get 函数进行计算、转变,并得到结果。
虚拟属性可以使得从数据源中读取的数据更有意义和可读性。它们能够减少代码复杂度并提供更好的应用程序设计。
如何定义虚拟属性
使用 Mongoose 的虚拟属性非常简单,只需要使用 schema 物件上定义虚拟属性。
虚拟属性的定义方法:
// javascriptcn.com 代码示例 const schema = new mongoose.Schema({ firstName: { type: String }, lastName: { type: String }, }); // define a virtual property fullName schema.virtual('fullName').get(function () { return `${this.firstName} ${this.lastName}`; });
在上面的代码中,我们定义了一个虚拟属性 fullName,由 firstName 和 lastName 组成。get 函数用于计算 fullName 的值。
如何使用虚拟属性
使用虚拟属性并不需要任何特殊的语句或操作。只需要通过特定的 get 函数即可获取虚拟属性的值。例如:
const User = mongoose.model('User', schema); const user = new User({ firstName: 'John', lastName: 'Doe', }); console.log(user.fullName); // output: 'John Doe'
如上代码块,fullName 已被计算出并输出。
虚拟属性的应用场景
虚拟属性的应用场景是可以通过计算得出的数据。例如:
- 根据数据库中的布尔值判断数据的某一个特性。
// javascriptcn.com 代码示例 const schema = new mongoose.Schema({ firstName: { type: String }, lastName: { type: String }, isAdmin: { type: Boolean, default: false }, }); schema.virtual('status').get(function () { return this.isAdmin ? 'Admin' : 'Regular user'; });
- 将日期格式化为一定的时间格式。
// javascriptcn.com 代码示例 const schema = new mongoose.Schema({ firstName: { type: String }, lastName: { type: String }, createdAt: { type: Date, default: Date.now }, }); schema.virtual('formattedDate').get(function () { return this.createdAt.toISOString().substr(0, 10); }); // output: 2022-06-25
- 从文本字段中抽取出需要的部分。
// javascriptcn.com 代码示例 const schema = new mongoose.Schema({ firstName: { type: String }, lastName: { type: String }, email: { type: String }, }); schema.virtual('username').get(function () { return this.email.split('@')[0]; }); // output: 'john.doe'
总结
Mongoose 的虚拟属性是一个非常有用的功能,可以使代码变得更简洁、易读和易于理解。通过虚拟属性,开发人员可以快速创建许多有用的属性,而不需要存储它们在数据库中。本文详细介绍了虚拟属性的定义方法及使用场景,希望对于前端开发人员有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653896947d4982a6eb17f742