Mongoose 是一个 Node.js 的 MongoDB 驱动程序,它提供了方便的方法来定义和操作 MongoDB 数据库中的文档。其中 Mongoose schema 是一个非常重要的概念,它不仅仅是一个 class,还有很多复杂的用法,甚至可以让你逼疯。
什么是 Mongoose schema
Mongoose schema 是一个用来定义 MongoDB 文档结构的模式对象,它包含了文档的字段、类型、默认值、验证规则等信息。在 Mongoose 中,每个 schema 对应一个 collection,每个 collection 中的文档都必须符合相应的 schema。
一个简单的 Mongoose schema 可以这样定义:
const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, age: Number, email: String, });
这个 schema 定义了一个名为 User
的 collection,其中每个文档包含 name
、age
和 email
三个字段,分别对应 String、Number 和 String 类型。
Mongoose schema 的高级用法
除了简单的字段定义外,Mongoose schema 还有很多高级用法,包括:
子文档
Mongoose schema 支持在一个文档中嵌套另一个文档,这被称为子文档。子文档的定义方法与普通字段一样,只需将子文档的 schema 作为一个字段定义即可。
-- -------------------- ---- ------- ----- ------------- - --- ----------------- ------- ------- ----- ------- ------ ------- --- ----- ---------- - --- ----------------- ----- ------- ---- ------- ------ ------- -------- -------------- ---
这个 schema 定义了一个名为 User
的 collection,其中每个文档包含 name
、age
、email
和 address
四个字段,其中 address
是一个子文档,包含 street
、city
和 state
三个字段。
虚拟属性
Mongoose schema 还支持定义虚拟属性,即不存储在 MongoDB 中的计算属性。虚拟属性可以用来处理一些复杂的逻辑,例如将多个字段合并成一个字段。
const userSchema = new mongoose.Schema({ firstName: String, lastName: String, }); userSchema.virtual('fullName').get(function () { return this.firstName + ' ' + this.lastName; });
这个 schema 定义了一个名为 User
的 collection,其中每个文档包含 firstName
和 lastName
两个字段,还定义了一个虚拟属性 fullName
,它是通过 firstName
和 lastName
计算得出的。
实例方法和静态方法
Mongoose schema 还支持定义实例方法和静态方法。实例方法是可以在文档实例上调用的方法,静态方法是可以在模型上调用的方法。
-- -------------------- ---- ------- ----- ---------- - --- ----------------- ----- ------- ---- ------- --- ------------------------------- - -------- -- - ------ --- -------------------- - --------- -- ---------------------------- - -------- ----- - ------ ----------- --- --- --
这个 schema 定义了一个名为 User
的 collection,其中每个文档包含 name
和 age
两个字段,还定义了一个实例方法 getBirthYear
,它返回用户的出生年份,还定义了一个静态方法 findByAge
,它返回指定年龄的用户。
Mongoose schema 的指导意义
Mongoose schema 是开发 Node.js 应用程序时不可或缺的一部分,它可以帮助我们更方便地操作 MongoDB 数据库中的文档。但是,Mongoose schema 的使用也有一些需要注意的地方:
不要过度设计 schema
在设计 Mongoose schema 时,不要过度设计,只定义需要的字段和方法。过度设计会导致代码冗余、可维护性差,还会降低应用程序的性能。
理解 schema 的验证规则
Mongoose schema 的验证规则非常丰富,可以帮助我们在保存文档时进行验证,确保数据的正确性。但是,需要注意理解每个验证规则的含义和用法,避免出现不必要的错误。
将 schema 抽象成模块
在开发大型应用程序时,可能会定义很多 Mongoose schema,为了方便管理和重用,可以将相似的 schema 抽象成模块,避免重复编写代码。
示例代码
下面是一个完整的示例代码,展示了如何定义和使用 Mongoose schema:
-- -------------------- ---- ------- ----- -------- - -------------------- -- ----- ----- ------------- - --- ----------------- ------- ------- ----- ------- ------ ------- --- -- ------ ----- ---------- - --- ----------------- ---------- ------- --------- ------- --- ------------------------------------------- -- - ------ -------------- - - - - -------------- --- -- ----------- ------------------------------- - -------- -- - ------ --- -------------------- - --------- -- ---------------------------- - -------- ----- - ------ ----------- --- --- -- -- -- ---------- ----- ---- - ---------------------- ------------ -- ---- ----- ---- - --- ------ ---------- ------- --------- ------ ---- --- -------- - ------- ---- ---- ---- ----- ---------- ------ ----- -- --- -- ---- ------------------ ----- - -- ----- - ------------------- - ---- - ----------------- ----- ---------------- - ---
这个示例代码定义了一个名为 User
的 collection,其中每个文档包含 firstName
、lastName
、age
和 address
四个字段,其中 address
是一个子文档,包含 street
、city
和 state
三个字段,还定义了一个虚拟属性 fullName
,一个实例方法 getBirthYear
和一个静态方法 findByAge
,最后创建了一个文档并保存到数据库中。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d3f9b2a941bf7134787097