如何在 Mongoose 中创建预定义模式

Mongoose 是 Node.js 中最流行的 MongoDB ODM(对象文档映射)库之一。它允许你以编程的方式定义模型以及相应的校验规则,使得你可以在应用中使用 MongoDB 数据库的内置功能,同时能够保证数据的一致性和完整性。

在本文中,我们将学习如何在 Mongoose 中创建预定义模式,以及如何使用模式定义模型。我们还将探讨模式中的各种数据类型、默认值和校验规则,并给出一些示例代码,以帮助你更好地理解概念。

创建预定义模式

在 Mongoose 中,预定义模式是用于创建模型的基本组件。预定义模式定义了模型中使用的各种属性、默认值和校验规则。每个模型都应该有一个与之关联的模式。

预定义模式可以直接定义在模型的构造函数中,也可以在模型的外部定义然后传递给模型构造函数。在本文中,我们将使用后者的方式来定义我们的预定义模式。

要定义预定义模式,你可以使用 Mongoose 中的 Schema 构造函数。Schema 构造函数接受一个对象作为参数,该对象列出了模型中的所有属性和其相关信息。下面是一个简单的预定义模式示例:

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

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

上面的代码中,我们创建了一个用户(User)模型的预定义模式。这个模式定义了三个属性:nameemailage

nameemail 属性都是必需的,这意味着在创建用户文档时必须提供这些属性。email 属性还设置了一个 unique 校验规则,强制要求在模型中每个文档的属性值唯一。

age 属性设置了一个默认值,这意味着如果在创建文档时不提供该属性,它将默认为 18。

在这个简单的示例中,我们定义了三种数据类型:字符串 String、数字 Number 和布尔 Boolean。Mongoose 还支持其他数据类型,包括日期、数组、嵌套对象等等。

使用预定义模式定义模型

当您定义了一个预定义模式之后,下一步是使用它来定义模型。为此,您可以使用 mongoose.model 方法,该方法接受两个参数:模型的名称和预定义模式的引用。

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

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

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

在上面的代码中,我们使用 mongoose.model 方法将刚刚创建的预定义模式与 User 模型关联起来,然后将该模型保存在变量 User 中。现在,我们可以使用 User 模型来进行 MongoDB 数据库中的文档操作。

模式中的数据类型

在 Mongoose 中,预定义模式允许您指定每个属性的数据类型。Mongoose 支持以下数据类型:

  • String
  • Number
  • Date
  • Buffer
  • Boolean
  • Mixed
  • ObjectId
  • Array
  • Decimal128
  • Map

以下是一些示例:

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

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

对于大多数的类型,你可以直接写类型名称。例如,上面的 name 属性直接指定为 String 类型,而不是 { type: String }

模式中的默认值

在 Mongoose 中,您可以使用 default 属性为模式的属性指定默认值。Mongoose 支持以下默认值类型:

  • 静态默认值
  • 动态默认值
  • 构造函数默认值

以下是一些示例:

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

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

在上面的代码中,age 属性使用静态默认值来设置默认值为 20。email 属性使用动态默认值,该默认值是一个函数,该函数使用该文档中的 name 数据来创建 email 地址。

date 属性使用了构造函数默认值,该默认值为当前日期和时间,由 Date.now 函数自动产生。

模式中的校验规则

在 Mongoose 中,您可以为模式的属性指定必需和其他类型的校验规则。下面是一些常见的校验规则:

  • required: 属性必须提供值
  • unique: 属性必须唯一
  • min: 属性最小值
  • max: 属性最大值
  • enum: 属性必须是指定值之一
  • match: 属性必须通过正则表达式测试
  • validate: 自定义属性验证函数

以下是一些示例:

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

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

在上面的代码中,我们列出了一些常见的校验规则。请注意,有些规则需要提供额外的参数或配置,例如 minmax 规则需要指定属性的最小值和最大值。

validate 规则允许您编写自定义验证函数,该验证函数将被传递给属性的值,并返回 truefalse 值,以指示该属性是否有效。此外,您还可以包含一条自定义错误消息,以指示出现错误的属性和原因。

示例代码

下面是一个简单的示例,演示如何使用 Mongoose 创建模式和模型:

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

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

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

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

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

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

上述代码将创建一个名为 User 的模型,并使用预定义模式为其定义三个属性:nameageemail。然后,它使用该模型创建一个新用户,并将其保存到 MongoDB 数据库。

如果没有发生错误,它将输出新用户的详细信息。

总结

在本文中,我们介绍了如何在 Mongoose 中创建预定义模式、使用模式定义模型、指定数据类型、默认值和校验规则。我们还提供了一些示例代码,以帮助您更好地了解Mongoose模式的使用方法。现在,您已经掌握了 Mongoose 模型的创建和使用技巧,应该能够开始使用它来构建强大而灵活的 Node.js 应用程序了。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6643aa75d3423812e41a332d


猜你喜欢

  • ES10 中新增的 String。prototype。trimStart() 和 String。prototype。trimEnd() 方法

    在ES10的新特性中,新增了两个方法——String.prototype.trimStart() 和 String.prototype.trimEnd(),它们分别用于去除字符串的开头和结尾的空格。

    5 个月前
  • ES9 中的 Object.fromEntries():简单解决对象转换问题

    在前端开发中,我们经常需要将一个对象转换为另一个对象,比如将一个数组转换为对象,或者将一个 Map 转换为对象。在 ES9 中,新增了一个 Object.fromEntries() 方法,可以方便地将...

    5 个月前
  • Kubernetes 部署 Java 应用总是出现 OutOfMemory 错误的解决方案

    问题描述 在使用 Kubernetes 部署 Java 应用程序时,有时会出现 OutOfMemory 错误。这个问题可能会导致应用程序崩溃或无法正常运行,给生产环境带来严重影响。

    5 个月前
  • SPA 应用中的数据缓存方案

    随着 Web 技术的不断发展,越来越多的网站开始采用 SPA(Single Page Application)技术来实现页面的动态加载和交互。而在 SPA 应用中,数据缓存是一个非常重要的问题。

    5 个月前
  • Promise 中的 catch 和 then 的差别及最佳实践

    在前端开发中,我们经常会使用 Promise 来处理异步操作。而在 Promise 中,catch 和 then 是两个常用的方法,它们的作用都是用于处理 Promise 的状态变化。

    5 个月前
  • Babel 7.5 之后,我们不再需要 babel-preset-env

    前言 在前端开发中,我们经常需要使用 Babel 来将 ES6+ 的代码转换成 ES5 的代码,以兼容不支持 ES6+ 的浏览器。而在 Babel 的配置中,我们通常会用到 babel-preset-...

    5 个月前
  • 如何在 Hapi.js 中集成 Swagger 文档

    Swagger 是一个流行的 API 文档生成工具,它可以帮助开发者自动生成 API 文档,方便其他开发者使用和理解接口。在 Hapi.js 中集成 Swagger 文档可以提高接口的可读性和可维护性...

    5 个月前
  • 在 Mocha 和 Chai 中如何 Mock 数据?

    在前端开发中,测试是一个非常重要的环节。在测试过程中,Mock 数据是非常有用的。Mock 数据可以帮助我们在测试时模拟出真实场景中的数据,从而更好地测试我们的代码。

    5 个月前
  • SPA 应用中的路由优化策略

    单页应用(Single Page Application,SPA)已经成为了现代 Web 开发中不可或缺的一部分。在 SPA 中,路由(Routing)是一个重要的概念,它负责将用户的 URL 映射到...

    5 个月前
  • 从 React 到 Next.js 的 Headless CMS 管理指南

    在现代 Web 开发中,Headless CMS 已经成为了一种趋势。它解耦了内容管理和前端展示,让前端开发者可以更加专注于用户界面和交互体验的设计。在这篇文章中,我们将介绍如何使用 React 和 ...

    5 个月前
  • Serverless 架构:如何使用 Lambda Layers 来分离共享代码?

    Serverless 架构是一种新型的云计算架构,它的核心思想是将所有的后端服务都交由云服务商来管理。这种架构的优势在于它可以让开发者更加专注于业务逻辑,而不需要关注底层的服务器和网络架构。

    5 个月前
  • 教你如何使用 Redux 调试 Chrome 插件

    前言 Redux 是一种用于 JavaScript 应用程序的可预测状态容器,它可以帮助我们管理应用程序的状态并使得状态变化可追溯。而 Chrome 插件是一种浏览器扩展,它可以通过 JavaScri...

    5 个月前
  • 前端单元测试利器 Enzyme

    什么是 Enzyme? Enzyme 是一个用于 React 应用程序的 JavaScript 测试实用程序库。它允许您更轻松地测试 React 组件的输出,使您能够对组件进行深度渲染、模拟用户交互和...

    5 个月前
  • Sass 中使用 css 选择器、@media 查询、:hover、+ 等样式

    介绍 Sass 是一种 CSS 预处理器,它扩展了 CSS 语言,提供了许多便利的功能,使得编写 CSS 变得更加简单、高效和可维护。本文将介绍 Sass 中如何使用 CSS 选择器、@media 查...

    5 个月前
  • 使用 aria-readonly 属性实现无障碍可读性

    在前端开发中,我们不仅要关注网站的外观和交互效果,还要考虑到无障碍可读性,以确保网站能为所有用户提供平等的使用体验。本文将介绍如何使用 aria-readonly 属性实现无障碍可读性,为有视觉障碍的...

    5 个月前
  • 如何调试 SPA 应用中的跨域问题

    单页面应用(SPA)已成为现代 Web 开发的主流方式之一,但是由于安全原因,Web 浏览器会限制跨域资源的访问。在开发 SPA 应用时,经常会遇到跨域问题,本文将介绍如何调试 SPA 应用中的跨域问...

    5 个月前
  • PWA 在移动端 Web 应用的实践应用

    随着移动设备的普及,Web 应用在移动端的使用越来越广泛。但是,由于网络环境的不确定性和设备性能的局限性,移动端 Web 应用的用户体验往往不如原生应用。这时候,PWA(Progressive Web...

    5 个月前
  • Express.js 和 Bootstrap 实现网站快速开发

    前言 在前端开发中,网站的快速开发是非常重要的。为了实现快速开发,我们可以使用一些流行的框架和库。在本文中,我们将介绍如何使用 Express.js 和 Bootstrap 快速开发网站。

    5 个月前
  • 如何在 Serverless 架构中使用自定义运行时?

    Serverless 架构是一种越来越流行的云计算架构,它可以让开发者更加专注于业务逻辑的实现,而不必关心底层的基础设施和运维。然而,Serverless 架构通常只支持一些特定的编程语言,这就限制了...

    5 个月前
  • Promise 中的 thenable 对象的应用实践

    在 JavaScript 中,Promise 是一种用于处理异步操作的对象,它可以让我们更方便地处理异步代码。而在 Promise 中,thenable 对象也是一个非常重要的概念。

    5 个月前

相关推荐

    暂无文章