Mongoose 中的 Schema 插件使用及一些常用插件

阅读时长 8 分钟读完

Mongoose 是一个 Node.js 和 MongoDB 的桥梁,它使得在 Node.js 中使用 MongoDB 数据库变得非常容易和方便。在 Mongoose 中使用 Schema 来为数据库集合定义结构和验证规则,而插件可以用来增强 Schema 的功能。

Schema 插件的使用

Mongoose 的插件可以用来为 Schema 添加各种额外的功能。插件是一个带有一些方法的 JavaScript 对象,这些方法可以被绑定到 Schema 或 Model 上。插件的作用是增加某些行为的实现,比如增加一个预处理钩子,增加静态方法等等。插件可以全局使用,也可以在特定 Schema 和 Model 上使用。

全局插件

通过在 Mongoose 上注册一个全局插件,就可以让这个插件在所有的 Schema 和 Model 上都可用。例如,我们可以使用以下代码来添加一个全局的 toJSON() 方法,让我们在对每个模型进行 JSON 序列化时都能得到期望的对象:

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

---------------------- -- -
  --------------------- - -
    ---------- ----- ---- -- -
      ------ -------
      ------ -------
      ------ ---
    -
  -
--
展开代码

在上面的代码中,我们定义了一个全局插件,并定义了一个 toJSON() 方法,用于将返回 JSON 对象时的输出进行处理。在这种情况下,我们删除了 _id__v 属性,确保在序列化对象时无需包含这些属性。

在特定 Schema 上使用插件

有时我们希望只有特定的 Schema 使用某个插件。这时候我们就需要在创建 Schema 时设置插件。例如:

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

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

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

-------------- - ---------------------- -----------
展开代码

在上面的代码中,我们在创建 userSchema 时,调用了 plugin() 方法,并传递了 require('mongoose-lifecycle') 插件(假定我们已经安装了该插件)。这样,我们就在 userSchema 上增加了这个插件的方法和属性,在使用时就能够直接调用。

插件钩子

插件可以利用 Mongoose 生命周期钩子来拦截和修改数据存储行为。Mongoose 生命周期钩子的类型包括 initvalidatesaveremovefindOneAndUpdate。插件提供的钩子可以帮助你在打破代码的同时保持整体性。

以下是一个使用插件 Pre 和 Post 钩子的示例,用来添加 "created_at" 和 "updated_at" 字段:

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

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

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

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

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

    ------
  --

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

    ------
  --
-

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

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

-------------- - ---------------------- -----------
展开代码

在上面的代码中,我们通过 timestampPlugin 插件定义了两个字段 created_atupdated_at,并且通过 pre 钩子在创建和更新时设置它们的值。

常用插件

下面是一些常用的 Mongoose 插件。

mongoose-timestamp

mongoose-timestamp 是一个简单的插件,它可以帮助我们轻松地添加 created_atupdated_at 字段。我们可以将其作为全局插件,也可以作为指定 Schema 上的插件使用。

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

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

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

----- ---- - ---------------------- -----------
展开代码

注意,mongoose-timestamp 并不会使用日期时间索引,因为这需要额外的配置。

mongoose-hidden

很多时候,仅在将对象序列化为 JSON 格式或传递给前端时才需要隐藏某些字段,而不是像通常情况下那样将其暴露在 UI 上。使用 mongoose-hidden 插件,可以方便地在 toJSON、toObject 或 JSON.stringify() 时隐藏指定字段。

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

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

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

----- ---- - ---------------------- -----------
展开代码

mongoose-unique-validator

当存在唯一性要求时,mongoose-unique-validator 使验证和错误处理变得更加容易。在定义 Schema 时,我们可以这样使用它:

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

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

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

----- ---- - ---------------------- -----------
展开代码

该插件会添加一个唯一性验证器到定义了 unique 属性的字段上,如果该字段不符合唯一性要求,则会抛出一个错误。

mongoose-autopopulate

mongoose-autopopulate 插件可以自动填充嵌套对象,以避免手动调用 populate()。我们可以轻松地在创建 Schema 时启用该功能:

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

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

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

-------------- - ---------------------- -----------
展开代码

使用 mongoose-autopopulate 插件后,只需要在 Schema 的字段上启用 autopopulate 标志,即可自动填充嵌套对象,这样就能避免手动调用 populate() 方法。

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

纠错
反馈

纠错反馈