在GraphQL Mutation中无法同时操作两个MongoDB集合的问题
问题
我正在开发基于Node.js、GraphQL和MongoDB的后端项目,包含Project集合和存储用户项目编辑记录的EditedProject集合。编写的editProject mutation期望根据originalProjectId将Project文档更新为已审批的EditedProject信息,同时删除对应EditedProject文档。但目前仅Project集合更新生效,注释更新代码后删除操作可正常执行。在Project.updateOne及后续.save()代码后,console.log(originalProjectId)无输出,怀疑是.save()导致问题。相关代码如下:
import EditedProject from '../../models/EditedProject.js'; import Project from '../../models/Project.js'; import { requireAuth } from '../../services/auth.js'; import { ObjectId } from "mongodb"; export default { editeProject: async (_, {input}) => { try { const originalProjectId = input.originalProjectId const project = await Project.updateOne({"_id":new ObjectId(originalProjectId)}, {$set: { "date": input.date, "type": input.type, "edited":'Approved', }}) const editResult = await project.save(); console.log(originalProjectId) const deleteEditedProject = await EditedProject.find({"originalProjectId":originalProjectId}) const deleteResult = await deleteEditedProject.save(); return originalProjectId; } catch (error) { return { errorMessage:error.message }; } }, }
解决方法
问题根源
updateOne返回值误用:Project.updateOne()执行后返回的是更新状态对象(包含nModified等统计字段),并非MongoDB文档实例,调用.save()会直接抛出错误,导致代码进入catch块,后续日志打印和删除操作完全无法执行。- 删除逻辑错误:用
find()获取文档后调用.save()是保存操作,和删除需求完全不符。
修复步骤
- 移除
Project.updateOne()后的.save()调用,updateOne()本身已经完成更新操作。 - 替换删除逻辑:使用
EditedProject.deleteMany()(若确定仅一条记录可改用deleteOne())删除对应originalProjectId的文档。 - 可选:在
catch块中新增错误日志,方便调试定位问题。
修正后的代码
import EditedProject from '../../models/EditedProject.js'; import Project from '../../models/Project.js'; import { requireAuth } from '../../services/auth.js'; import { ObjectId } from "mongodb"; export default { editeProject: async (_, {input}) => { try { const originalProjectId = input.originalProjectId; // 执行Project更新,无需额外调用save await Project.updateOne( {"_id": new ObjectId(originalProjectId)}, {$set: { "date": input.date, "type": input.type, "edited": 'Approved', }} ); console.log(originalProjectId); // 删除对应EditedProject文档 await EditedProject.deleteMany({"originalProjectId": originalProjectId}); return originalProjectId; } catch (error) { console.error("操作失败:", error); // 新增错误日志便于调试 return { errorMessage: error.message }; } }, }
内容的提问来源于stack exchange,提问作者pelotador.1
相关产品推荐
相关产品推荐

