Mongoose调用findOneAndUpdate更新MongoDB数据不生效如何解决?
问题原因
findOneAndUpdate为异步方法,你当前代码未通过await或回调等待方法执行完成,更新逻辑在触发后没有实际完成执行就被中断了。- 先查询再更新的冗余逻辑存在竞态风险,可通过内置参数简化避免。
修复方案
推荐直接使用findOneAndUpdate的upsert参数,单方法同时实现「不存在则新建、存在则更新」的逻辑,无需拆分两次数据库操作:
await muteSchema.findOneAndUpdate( { guildId: message.guild.id }, { guildId: message.guild.id, roleId: role.id }, { upsert: true, // 匹配不到对应guildId的文档时自动新建 new: true // 可选配置,开启后返回更新后的最新文档 } ).catch(err => console.log(err))
如果你要保留原有先查询再更新的写法,只需要给findOneAndUpdate加上await等待异步执行完成即可:
muteSchema.findOne( { guildId: message.guild.id }, async (err, data) => { if(err) console.log(err) if(data) { // 新增await等待更新操作执行完成 await muteSchema.findOneAndUpdate( { guildId: data.guildId }, { guildId: message.guild.id, roleId: role.id } ).catch(err => console.log(err)) } else { data = new muteSchema( { guildId: message.guild.id, roleId: role.id } ) data.save().catch((err) => console.log(err) ) } } )
内容的提问来源于stack exchange,提问作者hajajdvshskaja
相关产品推荐
相关产品推荐

