如何编写GraphQL update mutation实现MongoDB已有数据更新?
解答
你的实现思路完全正确,更新操作的标准处理逻辑就是先通过唯一ID定位到MongoDB中的目标记录,再对传入了有效值的字段做更新,最后返回更新后的结果即可。
你当前导入了Mongoose的Student模型,直接用Mongoose封装好的内置方法就能实现需求,有两种常用的实现方式可选:
方案1:先查后改(适合需要做前置数据校验的场景)
这种方式先拿到原始数据,可在校验数据逻辑之后再执行更新,灵活性更高:
resolve(parent, args) { // 按ID查询目标学生记录 return Student.findById(args.id).then(student => { if (!student) throw new Error("对应ID的学生记录不存在"); // 遍历传入的参数,只更新有值的字段,未传入的保持原有值 Object.keys(args).forEach(field => { if (args[field] !== undefined) { student[field] = args[field]; } }); // 保存修改并返回更新后的数据 return student.save(); }) }
方案2:直接调用更新方法(更简洁性能更高)
直接使用Mongoose内置的findByIdAndUpdate方法,无需手动查询和赋值:
resolve(parent, args) { // 参数new: true 表示返回更新后的文档,runValidators: true 触发字段校验规则 return Student.findByIdAndUpdate(args.id, args, { new: true, runValidators: true }) .then(updatedStudent => { if (!updatedStudent) throw new Error("对应ID的学生记录不存在"); return updatedStudent; }) }
注意事项
- 你当前定义的
editStudent参数结构是合理的,除了必填的ID外其余字段都没有加NonNull约束,客户端调用时可以只传需要修改的字段即可 - 新增
runValidators: true参数可以触发你在Mongoose Student模型中定义的字段校验规则,避免写入非法数据 - 如果业务需要校验修改权限,可以在执行更新逻辑之前增加对应的权限判断代码
内容的提问来源于stack exchange,提问作者user14593966
相关产品推荐
相关产品推荐

