解决Mongoose中用户score自增与history数组追加不生效问题
问题排查与解决:MongoDB用户数据更新失效
问题场景
数据库包含user表与card表:user表有score(数值类型)和history(字符串数组类型)字段;card表存储卡片信息及唯一_id。调用/CardClicked接口需完成两个操作:
- 将
score字段自增1.5 - 将卡片
_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
相关产品推荐
相关产品推荐

