如何在GraphQL中变更数组类型状态并保留历史数据?
问题原因
- 数组拼接逻辑错误:你当前编写的
[winRatio, (await wins) / (await totalPlays)]逻辑,会将原本就是数组的winRatio整体作为新数组的第一个元素,生成[[旧值1, 旧值2...], 新值]的嵌套数组结构,和你Schema定义的一维[Float]类型不匹配,服务端校验时会自动过滤不符合类型要求的内容,最终仅保留最后一个合法的浮点数数值。 - 更新逻辑为全量替换:GraphQL的基础update操作默认是直接替换字段的值,不会自动追加数组元素,你需要先拿到历史全量数据再拼接新值。
修复方案
- 先查询当前已存储的
winRatio历史数据 - 使用展开运算符
...把旧数组的所有元素平铺到新数组中,再追加新计算的胜率值
正确代码示例:
// 第一步:先查询当前已存储的历史胜率数据 const oldPlayData = await API.graphql({ query: getPlay, // 替换为你实际的查询单个Play的query variables: { id: yourPlayId } // 替换为你要更新的Play记录的ID }) const oldWinRatio = oldPlayData.data.getPlay.winRatio || [] // 第二步:拼接新值后执行更新 const newWinRate = (await wins) / (await totalPlays) await API.graphql({ query: updatePlay, variables: { input: { id: yourPlayId, winRatio: [...oldWinRatio, newWinRate] // 展开旧数组+追加新值 }, }, })
可选优化
如果你使用的GraphQL服务端支持数组原子追加操作,可不用每次全量查询再回写,直接通过服务端指令完成追加,性能和并发安全性更高。
内容的提问来源于stack exchange,提问作者Tyler Morales
相关产品推荐
相关产品推荐

