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

使用Mongoose复制MongoDB集合数据时遇VersionError问题求助

解决VersionError并复制课程数据到classes_taken集合

问题原因

你直接将ClassModel查询返回的Mongoose文档实例传给TakenClassesModel,这个实例带有原集合的_id、版本控制字段__v以及Mongoose内部元数据。调用save()时,Mongoose误判为要更新一个已存在的文档,但该文档在classes_taken集合中并不存在,因此抛出VersionError。

解决方法

要完整复制数据,需先把Mongoose文档转为纯JavaScript对象,去除内部元数据,再创建新模型实例保存:

修改后的代码

// POST request to add a class taken
app.post("/addClass", async (req, res) => {
  const subject_id = req.body.subject_id;
  const classTaken = await ClassModel.findOne({
    subject_id: subject_id,
  });

  if (!classTaken) {
    return res.status(404).json({ error: "课程不存在" });
  }

  try {
    // 转为纯JS对象,剥离Mongoose内部元数据
    const classData = classTaken.toObject();
    // 删除原文档的_id和版本字段(可选:保留_id则新文档复用原ID,删除则由MongoDB自动生成新ID)
    delete classData._id;
    delete classData.__v;
    
    const newClass = new TakenClassesModel(classData);
    await newClass.save();
    res.json(newClass);
  } catch (err) {
    console.log(err);
    res.status(500).json({ error: "添加课程失败" });
  }
});

关键说明

  • toObject()方法能彻底移除Mongoose文档的实例属性与内部元数据,得到干净的原始数据对象。
  • 删除__v字段可完全避开版本控制逻辑对新集合文档操作的干扰。
  • 若不需要复用原课程的_id,删除该字段后MongoDB会自动为classes_taken集合的新文档生成唯一ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:57:54