Mongoose 是一个非常流行的 Node.js ORM 框架,它可以让我们更方便地操作 MongoDB 数据库。虚拟属性和 getters/setters 是 Mongoose 中非常实用的特性,它们可以让我们更方便地对数据进行处理和格式化。本文将介绍 Mongoose 中使用虚拟属性和 getters/setters 的最佳实践,并给出详细的示例代码。
虚拟属性
虚拟属性是一种不会被保存到数据库中的属性,它们是通过 Mongoose 的虚拟属性 API 计算得到的。虚拟属性可以用于对数据库中的字段进行二次处理,例如对时间戳进行格式化、对字符串进行截断等。
定义虚拟属性
在 Mongoose 中定义虚拟属性非常简单,只需要在 Schema 中使用 virtual 方法即可:
const UserSchema = new mongoose.Schema({
firstName: String,
lastName: String
});
UserSchema.virtual('fullName').get(function() {
return `${this.firstName} ${this.lastName}`;
});上面的代码定义了一个名为 fullName 的虚拟属性,它是由 firstName 和 lastName 计算得到的。我们可以通过以下方式来访问虚拟属性:
const user = new User({ firstName: 'John', lastName: 'Doe' });
console.log(user.fullName); // "John Doe"虚拟属性的作用
虚拟属性可以用于对数据库中的字段进行二次处理,例如对时间戳进行格式化、对字符串进行截断等。下面是一个对时间戳进行格式化的示例:
// www.javascriptcn.com code example
const PostSchema = new mongoose.Schema({
title: String,
content: String,
createdAt: Date
});
PostSchema.virtual('formattedCreatedAt').get(function() {
const date = new Date(this.createdAt);
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
});
const Post = mongoose.model('Post', PostSchema);
const post = new Post({
title: 'Hello World',
content: 'This is my first post.',
createdAt: new Date()
});
console.log(post.formattedCreatedAt); // "2021-10-19"上面的代码中,我们定义了一个名为 formattedCreatedAt 的虚拟属性,它是由 createdAt 计算得到的。我们在 get 方法中对时间戳进行了格式化,并返回了格式化后的字符串。
注意事项
虚拟属性是不会被保存到数据库中的,因此我们不能将虚拟属性用于查询和排序等操作。如果我们需要对虚拟属性进行查询和排序,可以使用 Mongoose 的 aggregate 方法。
Getters 和 Setters
Getters 和 Setters 是 Mongoose 中另一个非常实用的特性,它们可以用于对数据库中的字段进行格式化和校验。Getters 用于在获取字段值时进行格式化,Setters 用于在设置字段值时进行校验。
定义 Getters 和 Setters
在 Mongoose 中定义 Getters 和 Setters 也非常简单,只需要在 Schema 中使用 get 和 set 方法即可:
// www.javascriptcn.com code example
const UserSchema = new mongoose.Schema({
firstName: String,
lastName: String,
email: String
});
UserSchema.path('email').get(function(value) {
return value.toLowerCase();
}).set(function(value) {
return value.trim();
});上面的代码定义了一个名为 email 的字段,并定义了 get 和 set 方法。在 get 方法中,我们将 email 的值转换为小写;在 set 方法中,我们将 email 的值去掉前后空格。
Getters 和 Setters 的作用
Getters 和 Setters 可以用于对数据库中的字段进行格式化和校验。下面是一个对手机号进行格式化和校验的示例:
// www.javascriptcn.com code example
const UserSchema = new mongoose.Schema({
firstName: String,
lastName: String,
phone: String
});
UserSchema.path('phone').get(function(value) {
return value.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3');
}).set(function(value) {
if (!/^\d{11}$/.test(value)) {
throw new Error('Invalid phone number');
}
return value;
});
const User = mongoose.model('User', UserSchema);
const user = new User({
firstName: 'John',
lastName: 'Doe',
phone: '12345678901'
});
console.log(user.phone); // "123-4567-8901"
user.phone = '123';
// 抛出错误:Invalid phone number上面的代码中,我们定义了一个名为 phone 的字段,并定义了 get 和 set 方法。在 get 方法中,我们对手机号进行了格式化;在 set 方法中,我们对手机号进行了校验,如果不符合要求就抛出错误。
注意事项
Getters 和 Setters 可以用于对数据库中的字段进行格式化和校验,但是它们并不是万能的。如果我们需要对字段进行复杂的处理,或者需要对多个字段进行处理,建议使用虚拟属性。
结语
本文介绍了 Mongoose 中使用虚拟属性和 getters/setters 的最佳实践,并给出了详细的示例代码。虚拟属性和 getters/setters 是 Mongoose 中非常实用的特性,它们可以让我们更方便地对数据进行处理和格式化。在实际开发中,我们应该根据具体情况选择使用虚拟属性、Getters 或 Setters,以达到最佳的开发效果。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d24cdea941bf713445dd06