Mongoose 是一个优秀的 Node.js 基础框架,它提供了良好的数据建模和数据操作支持,让开发者在应用开发过程中更加的高效和灵活。但是在使用 Mongoose 的过程中往往会遇到一些常见问题,比如更新不存在的文档,这就需要我们进行相关的解决方案,以保证我们的系统稳定和可靠。本文将为大家分享如何解决 Mongoose 允许更新不存在的文档问题。
问题分析
Mongoose 在默认情况下,当更新不存在的文档时,不会抛出错误。比如使用 update
方法:
const User = mongoose.model('User', { name: String }); User.update({ name: 'David' }, { age: 9 }, function(err, res) { if (err) { console.log('Failed to update a user!'); return; } console.log('Updated ' + res.nModified + ' users!'); });
如果数据库中不存在 name 为 David 的用户数据,则会更新 0 条数据,但并不会抛出错误信息。
但是在实际开发中,我们往往需要明确了解是否出现了更新不存在的文档的情况,否则我们无法判断出来是否有数据更新失败。
下面是一个更加具体的例子:
-- -------------------- ---- ------- ----- ----------- - ----------------- -------- ------- ---------- ------- ------ ------- --------- ------ --- ----- ----- - ----------------------- ------------- -------------- -------- ------------- -- - --------- - -- ------------- ---- - -- ----- - ------------------- -- ------ -- --------- ------- - -------------------- - - ------------- - - ---------- ---
如果数据库中不存在 orderId 为 01123581321 的订单数据,同样也会更新 0 条数据,也不会抛出错误信息。
解决方案
要解决这个问题,我们需要在 Mongoose 中使用 setOptions
方法,在更新操作时开启 upsert
和 new
选项:
const User = mongoose.model('User', { name: String }); User.update({ name: 'David' }, { age: 9 }, { upsert: true, new: true }, function(err, res) { if (err) { console.log('Failed to update a user!'); return; } console.log('Updated ' + res.nModified + ' users!'); });
这里的 upsert
表示如果数据库中不存在对应的数据,则会新建一个文档,而 new
表示会返回更新之后的数据。这样我们就能够获知更新了几个文档,以及具体的文档数据。
同样的,在订单操作中,我们也需要使用 upsert
和 new
选项:
-- -------------------- ---- ------- ----- ----------- - ----------------- -------- ------- ---------- ------- ------ ------- --------- ------ --- ----- ----- - ----------------------- ------------- -------------- -------- ------------- -- - --------- - -- - ------- ----- ---- ---- -- ------------- ---- - -- ----- - ------------------- -- ------ -- --------- ------- - -------------------- - - ------------- - - ---------- ---
总结
本文主要介绍了 Mongoose 更新不存在的文档问题的解决方案。在实际开发中,我们需要根据实际需求来选择是否开启 upsert
和 new
选项,以保证系统的稳定和可靠。同时,我们需要在对 Mongoose 数据库进行操作时仔细处理错误信息,以便早发现和解决问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ad112d48841e989493779e