在使用 Mongoose 的时候,我们通常都需要定义模型,来描述数据的结构和行为。而在定义模型的过程中,我们可以使用 Mongoose 的 defined 方法来更加精确、清晰地定义属性。
为什么需要 defined 方法
在使用 Mongoose 定义模型时,常常需要指定模型的属性,例如:
const UserSchema = new mongoose.Schema({ username: String, password: String, email: String, age: Number });
在这个例子中,我们定义了 User 模型,该模型包含四个属性:username、password、email 和 age。但是,这个定义方式存在一些问题:
- 属性名和类型被混在了一起,导致不易阅读。
- 由于使用了原生的 JavaScript 类型,难以限定属性的取值范围。
- 难以对类型进行转换。
为了解决这些问题,我们可以使用 defined 方法进行更加精确的定义。
使用 defined 方法
使用 defined 方法定义属性,语法如下:
{ field: { type: <Type>, ...options } }
field
: 表示字段名。type
: 表示数据类型。options
: 更详细的配置信息。
举个例子:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- --------- - ----- ------- --------- ---- -- --------- - ----- ------- --------- ----- ---------- - -- ------ - ----- ------- --------- ----- ------- ---- -- ---- ------ ---展开代码
在这个例子中,我们使用了 defined 方法来定义 User 模型的属性。每个属性都被定义成了一个对象,使用了 type 和 options 进行更加精确的定义。
options 详解
defined 方法的 options 选项提供了很多配置项,本节将对其中较为常用的选项进行详细介绍。
required
表示该字段是否必填。如果设置为 true,则 Mongoose 会在保存该模型实例前验证该字段是否存在。
default
表示该字段的默认值。如果该属性未被设置,或者设置为 null,那么该字段的值将被设置为 default。
validate
表示该字段的自定义验证函数。可以直接传入一个函数,也可以传入一个对象,该对象包含一个 validator 属性和可选的 message 属性。
例如:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- ------ - ----- ------- --------- - ---------- -------- --- - ------ ----------------------- -- -------- ----- -- --------------- -- --- - ----- ------- - - ---展开代码
enum
表示该字段的取值范围。可以传入一个数组,数组中的每个元素都是该字段可取的一个值。
例如:
const UserSchema = new mongoose.Schema({ gender: { type: String, enum: ['male', 'female'] } });
在这个例子中,gender 只能取值为 male 或 female。
match
表示该字段需要匹配的正则表达式。
例如:
const UserSchema = new mongoose.Schema({ phone: { type: String, match: /^\d{11}$/ } });
表示该字段必须为 11 位数字。
总结
在使用 Mongoose 定义模型时,采用 defined 方法定义属性可以更加清晰、精确地表述属性的类型和规则。在实际使用中,我们可以根据需求选择适合的选项进行配置,以达到最佳的开发效率和可读性。
参考代码:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------ - ---------------- ----- ---------- - --- ----------------- --------- - ----- ------- --------- ---- -- --------- - ----- ------- --------- ----- ---------- - -- ------ - ----- ------- --------- ----- ------- ---- -- ---- ------ --- ----- ---- - ---------------------- ------------ -------------- - -----展开代码
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65b9eda0add4f0e0ff278d79