如何更新Mongoose用户记录中data数组内已存在的题目作答选项
解决方案
方案1:基于现有代码修改
直接在预留的更新逻辑块修改匹配到的作答记录即可,修正后的完整代码如下:
let user = await User.findOne({ user: req.body.user }); // 查找对应题目的索引 const targetIndex = user.data.findIndex(res => res.quesId == req.body.id); if (targetIndex > -1) { // 直接更新已有记录的选项 user.data[targetIndex].option = req.body.opt; } else { // 新增作答记录,push是同步方法无需await user.data.push({ quesId: req.body.id, option: req.body.opt }); } // 统一保存,必须加await确保落库 await user.save();
方案2:原子操作优化(推荐)
无需先查询再修改,直接用MongoDB的数组定位符$实现单步原子更新,性能更高,避免并发问题:
// 先尝试更新已有作答 const updateRes = await User.findOneAndUpdate( { user: req.body.user, "data.quesId": req.body.id }, { $set: { "data.$.option": req.body.opt } } ); // 无匹配结果说明是首次作答,新增记录 if (!updateRes) { await User.findOneAndUpdate( { user: req.body.user }, { $push: { data: { quesId: req.body.id, option: req.body.opt } } } ); }
注意事项
- 原代码中
user.save()未加await,会出现异步时序问题,导致数据未及时更新 - 原代码中数组
push前加await是冗余操作,只有IO类异步方法才需要await
内容的提问来源于stack exchange,提问作者chaos
相关产品推荐
相关产品推荐

