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

如何更新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:24:03