使用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
相关产品推荐
相关产品推荐

