如何部分更新AWS Amplify GraphQL模型,无需提交整行FAQ数据
解决方案说明
你遇到的数组覆盖问题,核心原因是当前Schema中QuestionAndAnswer是嵌入式自定义类型,没有被定义为独立的@model,Amplify会将整个questionAndAnswer数组作为FAQ表的单个字段处理,更新时自然会全量覆盖原有内容。你可以根据需求选择以下两种方案:
方案一:调整Schema为关联模型(推荐)
将QuestionAndAnswer定义为独立的@model,通过关联关系和FAQ绑定,即可实现单条Q&A的独立增删改,完全不需要操作整条FAQ数据。
修改后Schema示例
type FAQ @model(timestamps: null) { id: ID! sectionTitle: String # 一对多关联,一个FAQ对应多个Q&A questionAndAnswers: [QuestionAndAnswer!]! @hasMany } type QuestionAndAnswer @model(timestamps: null) { id: ID! question: String answer: String # 关联对应的FAQ ID,建索引方便按FAQ查询所有Q&A faqID: ID! @index(name: "byFAQ") }
单条更新示例
调整Schema部署后,Amplify会自动生成QuestionAndAnswer对应的增删改查接口,你只需要调用updateQuestionAndAnswer mutation,传入目标Q&A的ID和修改的字段即可:
mutation UpdateSingleQA { updateQuestionAndAnswer(input: { id: "4", question: "修改后的问题4内容", answer: "修改后的回答4内容" }) { id question answer } }
这个方案没有并发修改冲突问题,单条操作的性能也更高,适合需要频繁操作单个Q&A的场景。
方案二:不改Schema的临时兼容方案
如果暂时不想调整现有结构,可以用「全量拉取-局部修改-全量回传」的逻辑实现更新,但不推荐长期使用,多用户同时修改同一个FAQ下的Q&A时会出现互相覆盖的问题:
- 先调用
getFAQ接口拉取对应FAQ的完整questionAndAnswer数组 - 前端找到数组中对应ID的Q&A项,修改需要更新的字段
- 把修改后的完整数组作为入参,调用
updateFAQ接口回传
示例mutation
mutation UpdateFAQFullArray { updateFAQ(input: { id: "22735682-2bab-4695-b93e-1e50642d4654", questionAndAnswer: [ {id: "4", question: "修改后的问题4", answer: "修改后的回答4"}, {id: "5", question: "question5", answer: "answer5"}, {id: "6", question: "question6", answer: "answer6"} ] }) { id questionAndAnswer } }
内容的提问来源于stack exchange,提问作者eternitysharp
相关产品推荐
相关产品推荐

