You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:55:36