Mongoose 中对 Schema 进行扩展的方法
在使用 MongoDB 数据库的时候,Mongoose 是一个非常受欢迎的对象模型工具。Mongoose 中的 Schema 是其核心部分之一,用来定义数据库中的文档结构。在实际开发中,我们常常需要对 Schema 进行扩展来满足不同的需求。本文将介绍 Mongoose 中对 Schema 进行扩展的方法。
扩展 Schema
Mongoose 中提供了多种方式来扩展 Schema,下面将会介绍其中较为常见的方法,并给出相应的示例代码。假设我们有一个 User 的 Schema 如下:
const userSchema = new Schema({ name: String, email: String, password: String })
- 添加字段
要添加一个字段,我们只需在 Schema 中定义即可:
const userSchema = new Schema({ name: String, email: String, password: String, phone: String })
这样,我们就添加了一个 phone 字段。
- 修改字段
如果想修改一个字段的类型、验证规则等,可以使用 SchemaType 的 set()
方法。例如,我们想将 name
字段的类型修改为 String
或添加默认值:
-- -------------------- ---- ------- ----- ---------- - --- -------- ----- - ----- ------- -------- ---------- -- ------ ------- --------- ------ -- ----------------------------------- -- - ------ ------------- --
上面代码将 name
字段的类型设置为 String
,默认值设置为 'Mongoose'
。set()
方法用来指定在设置值时执行的函数。这里的函数将值转换为 String 类型并返回。
- 添加虚拟属性
虚拟属性是根据 Schema 中的已有属性计算得到的属性,其本身并不存储在数据库中,但可以像普通属性一样获取和设置。
-- -------------------- ---- ------- ----- ---------- - --- -------- ----- ------- ------ ------- --------- ------- ------ ------ -- ------------------------------------------- -- - ------ --------- - - - - ---------- --
上面代码添加了一个虚拟属性 fullname
,其值为 name
和 email
拼接成的字符串。
- 添加实例方法
实例方法是在文档实例上调用的方法,可以在其中访问文档自身的属性。
-- -------------------- ---- ------- ----- ---------- - --- -------- ----- ------- ------ ------- --------- ------- ------ ------ -- ------------------------------ - -------- -- - ------------------ ------------- ------ -------------- ------ --------------- -
上面代码添加了一个实例方法 displayInfo()
,用来显示用户的基本信息。该方法可以通过文档实例访问。
- 添加静态方法
静态方法是在模型上调用的方法,可以在其中访问模型自身的属性和方法。
-- -------------------- ---- ------- ----- ---------- - --- -------- ----- ------- ------ ------- --------- ------- ------ ------ -- ----------------------------- - -------- ------ - ------ -------------- ---- -- -
上面代码添加了一个静态方法 findByName()
,用来查找用户。该方法可以通过模型访问。
总结
Mongoose 提供了多种方式来扩展 Schema,可以满足不同的需求。需要注意的是,Schema 的扩展不仅仅只是添加字段,还可以通过虚拟属性、实例方法和静态方法等方式来增强 Schema 的能力。我们应该根据项目需求来选择最合适的方式。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d37115b5eee0b525b11b41