Mongoose schema 用的不只是 class 而是逼疯了我

阅读时长 7 分钟读完

Mongoose 是一个 Node.js 的 MongoDB 驱动程序,它提供了方便的方法来定义和操作 MongoDB 数据库中的文档。其中 Mongoose schema 是一个非常重要的概念,它不仅仅是一个 class,还有很多复杂的用法,甚至可以让你逼疯。

什么是 Mongoose schema

Mongoose schema 是一个用来定义 MongoDB 文档结构的模式对象,它包含了文档的字段、类型、默认值、验证规则等信息。在 Mongoose 中,每个 schema 对应一个 collection,每个 collection 中的文档都必须符合相应的 schema。

一个简单的 Mongoose schema 可以这样定义:

这个 schema 定义了一个名为 User 的 collection,其中每个文档包含 nameageemail 三个字段,分别对应 String、Number 和 String 类型。

Mongoose schema 的高级用法

除了简单的字段定义外,Mongoose schema 还有很多高级用法,包括:

子文档

Mongoose schema 支持在一个文档中嵌套另一个文档,这被称为子文档。子文档的定义方法与普通字段一样,只需将子文档的 schema 作为一个字段定义即可。

-- -------------------- ---- -------
----- ------------- - --- -----------------
  ------- -------
  ----- -------
  ------ -------
---

----- ---------- - --- -----------------
  ----- -------
  ---- -------
  ------ -------
  -------- --------------
---

这个 schema 定义了一个名为 User 的 collection,其中每个文档包含 nameageemailaddress 四个字段,其中 address 是一个子文档,包含 streetcitystate 三个字段。

虚拟属性

Mongoose schema 还支持定义虚拟属性,即不存储在 MongoDB 中的计算属性。虚拟属性可以用来处理一些复杂的逻辑,例如将多个字段合并成一个字段。

这个 schema 定义了一个名为 User 的 collection,其中每个文档包含 firstNamelastName 两个字段,还定义了一个虚拟属性 fullName,它是通过 firstNamelastName 计算得出的。

实例方法和静态方法

Mongoose schema 还支持定义实例方法和静态方法。实例方法是可以在文档实例上调用的方法,静态方法是可以在模型上调用的方法。

-- -------------------- ---- -------
----- ---------- - --- -----------------
  ----- -------
  ---- -------
---

------------------------------- - -------- -- -
  ------ --- -------------------- - ---------
--

---------------------------- - -------- ----- -
  ------ ----------- --- ---
--

这个 schema 定义了一个名为 User 的 collection,其中每个文档包含 nameage 两个字段,还定义了一个实例方法 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,其中每个文档包含 firstNamelastNameageaddress 四个字段,其中 address 是一个子文档,包含 streetcitystate 三个字段,还定义了一个虚拟属性 fullName,一个实例方法 getBirthYear 和一个静态方法 findByAge,最后创建了一个文档并保存到数据库中。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d3f9b2a941bf7134787097

纠错
反馈