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

解决Mongoose中用户score自增与history数组追加不生效问题

问题排查与解决:MongoDB用户数据更新失效

问题场景

数据库包含user表与card表:user表有score(数值类型)和history(字符串数组类型)字段;card表存储卡片信息及唯一_id。调用/CardClicked接口需完成两个操作:

  1. 将score字段自增1.5
  2. 将卡片_id追加至history数组

但当前代码执行后字段未正确更新且无报错。

错误原因

mongoose的findOneAndUpdate方法参数传递错误:

  • 该方法的第二个参数应为合并所有更新操作的单个对象,第三个参数是配置选项(如upsert、new等)
  • 原代码将两个更新对象additionalPoints和putPostID分别作为第二、第三个参数,导致第三个参数被错误解析,实际更新逻辑未正常执行

修正后的代码

router.js 修正版

app.post('/CardClicked', async function (req, res) {
  console.log("User ID " + req.user._id, "Card ID : " + req.body._id);

  try {
    const condition = { _id: req.user._id };
    // 合并两个更新操作到同一个对象中
    const updateOps = {
      $inc: { score: 1.5 },
      $addToSet: { history: req.body._id }
    };
    // 第三个参数是配置选项,添加new:true可返回更新后的文档,方便调试
    const updatedUser = await User.findOneAndUpdate(condition, updateOps, { upsert: true, new: true });
    
    // 可选:返回更新后的用户数据,验证结果
    res.status(200).send({ user: updatedUser });
  } catch (err) {
    res.status(500).send({ error: err });
  }
});

额外注意事项

  • 重复添加控制:如果允许同一卡片_id多次出现在history数组中,将$addToSet替换为$push即可
  • 数据类型验证:确保req.user._id与数据库中user表的_id类型匹配(若使用ObjectId,需保证传入的是正确的ObjectId格式或字符串)
  • 调试辅助:添加new: true配置后,可通过返回的updatedUser查看更新结果,快速定位问题

内容的提问来源于stack exchange,提问作者Thestrike95

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:05:17