Mongoose 是 Node.js 中广泛使用的一款 MongoDB 驱动,它提供了许多便捷的方法来简化数据库操作,而其中更新操作尤为常见和重要。然而,Mongoose 中有一种较为偏好的写法——使用新语法实现更新操作,它有什么优点和缺点,该如何理解和使用呢?本文将介绍相关的内容。
传统的更新操作
在使用 Mongoose 进行更新操作时,可以使用传统的 updateOne
、updateMany
等方法,它们的用法如下:
Model.updateOne( { _id: id }, { $set: { field: value } }, function (err, res) { // ... error handling and result processing ... } )
其中,Model
是我们定义的模型,id
是需要更新的文档的 _id
值,$set
后跟需要更新的字段和对应的值。这种方式的问题在于,如果需要更新的字段比较多,就需要书写很多的 $set
语句,而且一旦更新的数据较多,语句也会变得很长,难以阅读和理解。
使用新语法的更新操作
为了解决传统的更新方式中的问题,Mongoose 开始支持新的更新语法,其使用方式如下:
Model.updateOne({ _id: id }, { field: value }, function (err, res) { // ... error handling and result processing ... })
可以发现,新语法中去掉了 $set
,直接以对象的形式传入需要更新的字段和对应的值。这种方式更加简洁明了,大大降低了代码量,同时结构清晰,易于理解。
值得注意的是,新语法有一个重要的限制条件,即它只支持以顶级键的方式更新字段。什么是顶级键呢?它指的是文档中的直接子元素,而非子文档或数组中的元素。
例如,下面的文档结构:
-- -------------------- ---- ------- - ---- -------------- ------- --------- ------- - ---------- --------- ---------- -------- -- ------- -- ------------ -------- -- - ------------ -------- -- -展开代码
则 field1
、field2
、field3
是顶级键,而 subfield1
、subfield2
、arrayField1
、arrayField2
不是。如果尝试使用新语法更新 subfield1
的值,则会报错。
使用新语法的优点和缺点
使用新语法的优点已经在前面提到过了,主要包括代码量少、结构清晰等。此外,新语法还支持同名字段的更新。例如,对于一个文件上传服务,可以通过如下方式更新文件的元数据:
-- -------------------- ---- ------- ---------------- - ---- -- -- - --------- ------------------ ----- ----- ----------- --- ------ -- -------- ----- ---- - -- --- ----- -------- --- ------ ---------- --- - -展开代码
可以看到,实际上这里更新了 3 个字段,其中 filename
字段有了新的值,而 size
和 updated_at
字段保持不变。使用 $set
方式则需要写成:
-- -------------------- ---- ------- ---------------- - ---- -- -- - ----- - --------- ------------------ ----- ----- ----------- --- ------ - -- -------- ----- ---- - -- --- ----- -------- --- ------ ---------- --- - -展开代码
在这种情况下,使用新语法的代码更加简洁易懂。
但是,新语法也有一些缺点。例如,它不支持子文档和数组元素的更新,对于这些情况,只能使用传统的方式进行更新。此外,如果文档结构层次较多,而且需要更新的字段也较多,新语法也可能出现代码重复或冗长的问题。
如何理解和使用新语法
需要强调的是,新语法只是 Mongoose 中更新操作的一个特点,不是必须使用的方式。在实际开发中,需要根据具体情况来灵活选择。
通常来说,如果更新的字段比较少,且不牵涉到子文档和数组元素,可以优先考虑使用新语法。例如更新用户信息的昵称、性别、头像等字段。
如果需要批量更新文档或更新的字段比较多,传统的方式可能更加合适。例如批量修改某个分类下的所有文章。
同时,需要注意文档结构和更新的字段情况,如果使用新语法进行更新时报错,可以尝试使用传统方式或者更改文档结构,使得需要更新的字段为顶级键。
示例代码
下面是使用新语法和传统语法分别实现更新操作的代码示例:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- ------ - --------------- -- ---- ----- ---------- - --- -------- ----- ------- ---- ------- -------- - ----- ------- ------- ------ - -- ----- ---- - ---------------------- ----------- -- --------- ---------------- ---- ------- -- - ----- ---------- ---- -- -- -------- - ---- --- - - -- ----- - ---------------- - ---- - ---------------- - -- -- ---------- --------------- - ---- ------- -- - ----- - ----------------- ----------- - -- -------- ----- ---- - -- ----- - ---------------- - ---- - ---------------- - - -展开代码
可以发现,使用新语法更加简洁易懂,而传统方式需要书写 $set
语句,代码较为冗长。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67bd899da231b2b7ed018e79