Mongoose 中使用 findByIdAndUpdate 的注意事项
Mongoose 是一个优秀的 Node.js ODM(对象文档映射器),它可以极大地简化与 MongoDB 的交互。Mongoose 提供了许多功能强大的 API,让我们能够更加便捷地操作 MongoDB 数据库。
在使用 Mongoose 进行 CRUD 操作时,findByIdAndUpdate 是一种非常常见的方法。这个方法可以根据 ID 查找到指定文档并更新其内容。然而,在使用这个方法的过程中,我们需要注意一些细节,本文就来介绍一下。
1. findByIdAndUpdate 的基本用法
findByIdAndUpdate 方法可以接收三个参数:文档 ID,要更新的内容和一个回调函数。其中,回调函数的第一个参数是错误对象,第二个参数是更新后的文档对象。
-- -------------------- ---- ------- ----- ---- - ---------------------- -- -- -- - --- ------ ----------------------------- - ---- -- -- ----- ----- -- - -- ----- - ------------------ - ---- - ----------------- - --
2. 使用 findByIdAndUpdate 的注意事项
虽然 findByIdAndUpdate 很方便,但在实际使用中,需要注意以下几点:
2.1 默认情况下,返回的是更新前的文档
默认情况下,findByIdAndUpdate 方法返回的是更新前的文档。如果我们想要得到更新后的文档,需要设置一个选项参数 { new: true }。如下代码:
// 更新 ID 为 123 的用户的年龄,并返回更新后的文档 User.findByIdAndUpdate('123', { age: 25 }, { new: true }, (err, user) => { if (err) { console.error(err) } else { console.log(user) } })
2.2 需要在 Schema 中设置 useFindAndModify 为 false
在 Mongoose 5.x 以前的版本中(包括 4.x 和 3.x),Mongoose 默认使用 MongoDB 的 findAndModify 方法来实现 findByIdAndUpdate,而在 MongoDB 4.2 中,findAndModify 已经被废弃,因此 Mongoose 5.x 中默认使用 MongoDB 的 findOneAndUpdate 方法来实现 findByIdAndUpdate。
两种方法之间的差异在于 findOneAndUpdate 默认情况下不会返回更新后的文档,需要将选项参数 { new: true } 传入才能返回。因此,如果我们使用了 Mongoose 5.x,就需要在 Schema 中将 useFindAndModify 设置为 false,以便让 Mongoose 使用 findOneAndUpdate 方法。
-- -------------------- ---- ------- ----- -------- - ------------------- ----- ------ - --------------- -- -- ---------------- - ----- -------------------------------- ------ ----- ---------- - --- -------- ----- ------- ---- ------ -- -------------- - ---------------------- -----------
2.3 执行 updateOne 和 updateMany 方法
在 Mongoose 5.x 中,findByIdAndUpdate 方法默认情况下是执行 updateOne 方法。也就是说,如果数据库中存在多个 ID 相同的文档,只有第一个符合条件的文档会被更新。
如果要更新多个文档,需要使用 updateMany 方法。
// 更新所有年龄大于 15 岁的用户 User.updateMany({ age: { $gt: 15 } }, { age: 25 }, (err, res) => { if (err) { console.error(err) } else { console.log(res) } })
3. 总结
findByIdAndUpdate 方法是在 Mongoose 中实现更新文档的一个很有用的方法。虽然用起来非常简单,但需要注意一些细节,以免造成不必要的错误。在实际使用中,我们需要设置选项参数 { new: true } 和 useFindAndModify 为 false,细心地检查操作的返回值,以便更加高效地操作 MongoDB 数据库。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c4302183d39b48817e2b39