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

在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
            };
            }
        },
}
解决方法

问题根源

  1. updateOne返回值误用:Project.updateOne()执行后返回的是更新状态对象(包含nModified等统计字段),并非MongoDB文档实例,调用.save()会直接抛出错误,导致代码进入catch块,后续日志打印和删除操作完全无法执行。
  2. 删除逻辑错误:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:42:53