Mongoose 中的动态 Schema 使用技巧

阅读时长 6 分钟读完

Mongoose 是一款优秀的 Node.js ORM 框架,它可以帮助我们方便的定义 MongoDB Schema,并提供了灵活的查询和聚合操作接口。在实际应用开发中,我们经常需要根据业务需求动态生成 Schema,以适应不同的数据结构。Mongoose 提供了一些 API 可以帮助我们实现动态 Schema 的定义和使用,本文将介绍动态 Schema 的使用技巧和示例代码。

为什么需要动态 Schema

传统的 ORM 框架一般都需要定义静态的 Schema,即在代码中明确声明数据库表的结构,例如:

但在实际应用开发中,我们可能需要针对不同的业务场景动态生成 Schema,例如:

  • 电商网站中商品分类可能会发生变化,需要动态改变产品的属性;
  • 社交网站中用户信息可能会发生变化,需要动态改变用户的属性。

为了应对这类需求,Mongoose 提供了动态定义 Schema 的能力。

动态 Schema 的使用技巧

在 Mongoose 中定义动态 Schema,主要有以下两种方式:

方式一:使用 set() 方法

set() 方法允许在模式对象上动态设置属性,例如:

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

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

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

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

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

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

上述示例中,我们通过 set() 方法向 ProductSchema 中动态添加了 color 属性,并给它赋值为 'red',最终将其保存进数据库中。

方式二:使用 dynamic 属性

dynamic 属性决定了 MongoDB 中是否允许保存没有在 Schema 中定义的字段。默认情况下 dynamic 为 true,也就是说可以随意保存任何字段,但如果把 dynamic 设为 false,那么 MongoDB 就会忽略没有在 Schema 中定义的字段。

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

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

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

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

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

上述示例中,我们通过设置 dynamic:true,使 UserSchema 具备了动态的属性,可以随意添加任何属性到 User 对象。例如上面示例的 extraField 属性,可以在 UserSchema 中不存在的情况下动态添加到 user 对象中,最终也能成功保存进数据库。

另外,如果需要动态删除某个属性,可以使用 unset() 方法:

示例代码

在电商网站中,商品的属性可能会频繁发生变化,为了应对这个需求,我们可以使用动态 Schema 功能来实现:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

上述代码中,我们通过 addProperty 和 removeProperty 两个方法来演示动态添加和删除属性的操作流程。我们首先通过调用 findById() 方法获取到一个 Product 对象,然后通过 set() 或 unset() 方法来动态修改对象的 Schema,最后将对象保存到数据库中。

总结

动态 Schema 是 Mongoose 中非常有用的一项功能,它使得我们可以方便的根据业务需求动态生成 Schema,从而更好地适应不同的数据结构。在实际使用中,我们可以通过 set() 和 dynamic 属性来实现动态修改对象的 Schema,为我们的开发带来了更多的灵活性。

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

纠错
反馈