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,最后创建了一个文档并保存到数据库中。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d3f9b2a941bf7134787097