如何在Mongoose中使用findOneAndUpdate()并保留指定字段值?
解决MongoDB更新时保留未修改字段值的问题
你的问题出在更新文档里显式设置了denies: 0,这会强制覆盖该字段的原有值,哪怕你只是想更新accepts。要让未更新的字段保持原值,只需要移除这个多余的字段定义即可。
修改后的基础代码
leaderboard.findOneAndUpdate( { userID: interaction.user.id }, { // 移除denies: 0,只保留需要递增的字段操作 $inc: { accepts: 1 } }, { upsert: true, new: true }, (err: any, doc: any) => { if (err) console.log(err) console.log(`Updated ${interaction.user.username}'s accepts to ${doc.accepts} `) })
补充:处理upsert时的默认值
如果需要在文档首次插入(upsert触发)时给denies设置默认值0,而后续更新时保持原值,可以用$setOnInsert实现——它只会在插入新文档时生效:
leaderboard.findOneAndUpdate( { userID: interaction.user.id }, { $inc: { accepts: 1 }, $setOnInsert: { userID: interaction.user.id, denies: 0 } }, { upsert: true, new: true }, (err: any, doc: any) => { if (err) console.log(err) console.log(`Updated ${interaction.user.username}'s accepts to ${doc.accepts} `) })
这样修改后,只有accepts会被递增,denies在已有文档中保持原值,新插入时才会设为0。
内容的提问来源于stack exchange,提问作者Jonathan Jones
相关产品推荐
相关产品推荐

