尝试理解 Mongoose 中偏好的写法:使用新语法实现更新操作

阅读时长 5 分钟读完

Mongoose 是 Node.js 中广泛使用的一款 MongoDB 驱动,它提供了许多便捷的方法来简化数据库操作,而其中更新操作尤为常见和重要。然而,Mongoose 中有一种较为偏好的写法——使用新语法实现更新操作,它有什么优点和缺点,该如何理解和使用呢?本文将介绍相关的内容。

传统的更新操作

在使用 Mongoose 进行更新操作时,可以使用传统的 updateOneupdateMany 等方法,它们的用法如下:

其中,Model 是我们定义的模型,id 是需要更新的文档的 _id 值,$set 后跟需要更新的字段和对应的值。这种方式的问题在于,如果需要更新的字段比较多,就需要书写很多的 $set 语句,而且一旦更新的数据较多,语句也会变得很长,难以阅读和理解。

使用新语法的更新操作

为了解决传统的更新方式中的问题,Mongoose 开始支持新的更新语法,其使用方式如下:

可以发现,新语法中去掉了 $set,直接以对象的形式传入需要更新的字段和对应的值。这种方式更加简洁明了,大大降低了代码量,同时结构清晰,易于理解。

值得注意的是,新语法有一个重要的限制条件,即它只支持以顶级键的方式更新字段。什么是顶级键呢?它指的是文档中的直接子元素,而非子文档或数组中的元素。

例如,下面的文档结构:

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

field1field2field3 是顶级键,而 subfield1subfield2arrayField1arrayField2 不是。如果尝试使用新语法更新 subfield1 的值,则会报错。

使用新语法的优点和缺点

使用新语法的优点已经在前面提到过了,主要包括代码量少、结构清晰等。此外,新语法还支持同名字段的更新。例如,对于一个文件上传服务,可以通过如下方式更新文件的元数据:

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

可以看到,实际上这里更新了 3 个字段,其中 filename 字段有了新的值,而 sizeupdated_at 字段保持不变。使用 $set 方式则需要写成:

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

在这种情况下,使用新语法的代码更加简洁易懂。

但是,新语法也有一些缺点。例如,它不支持子文档和数组元素的更新,对于这些情况,只能使用传统的方式进行更新。此外,如果文档结构层次较多,而且需要更新的字段也较多,新语法也可能出现代码重复或冗长的问题。

如何理解和使用新语法

需要强调的是,新语法只是 Mongoose 中更新操作的一个特点,不是必须使用的方式。在实际开发中,需要根据具体情况来灵活选择。

通常来说,如果更新的字段比较少,且不牵涉到子文档和数组元素,可以优先考虑使用新语法。例如更新用户信息的昵称、性别、头像等字段。

如果需要批量更新文档或更新的字段比较多,传统的方式可能更加合适。例如批量修改某个分类下的所有文章。

同时,需要注意文档结构和更新的字段情况,如果使用新语法进行更新时报错,可以尝试使用传统方式或者更改文档结构,使得需要更新的字段为顶级键。

示例代码

下面是使用新语法和传统语法分别实现更新操作的代码示例:

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

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

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

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

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

可以发现,使用新语法更加简洁易懂,而传统方式需要书写 $set 语句,代码较为冗长。

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

纠错
反馈

纠错反馈