如何使用 graphql 更新集合中的所有记录
Posted
技术标签:
【中文标题】如何使用 graphql 更新集合中的所有记录【英文标题】:How to update all records in a collection using graphql 【发布时间】:2017-06-01 00:41:51 【问题描述】:我正在使用 Graph.cool graphql 作为服务,我想知道如何对集合进行大规模更新,类似于 SQL 更新。
在我的情况下,我需要在我的数据库的 imageUrl 列中更新 url 的后缀。我需要将 someid_sm.jpg 换成 someid_lg.jpg
如何使用 graphql 突变来做到这一点?我不想再次重新加载整个数据集,我正在寻找一种不涉及使用 graphql 客户端手动交互整个列表的方法。
mutation
updatePost() // what goes here?
【问题讨论】:
interating through the entire list
- 这几乎是现在要走的路。我为您的想法添加了一个功能请求:github.com/graphcool/feature-requests/issues/67 我也可以帮助设置脚本。
【参考方案1】:
迁移脚本
最好的方法确实是使用结合multiple mutations 的迁移脚本,因此只有一个 HTTP 请求被发送到 GraphQL 后端。
考虑这个架构:
type Image
id: ID!
name: String!
我们可以使用 GraphQL 别名在一个请求中多次包含相同的突变:
mutation
first: updateImage(id: "first-id", name: "01_lg.jpg")
id
name
second: updateImage(id: "second-id", name: "02_lg.jpg")
id
name
我们将在迁移脚本中使用这种机制。我会用 Lokka 和 Node 来描述它,但是你可以选择你喜欢的任何语言和 GraphQL 客户端。
首先,我们查询所有现有图像以获取它们的id
和name
:
const queryImages = async() =>
const result = await client.query(`
images: allImages
id
name
`)
return result.images
然后我们相应地替换名称并构造一个大请求,包括必要的 updateImage
突变,并为每个突变使用不同的 GraphQL 别名。
如果您的图片名称可能在您的问题中提到的someid
部分中包含字符串sm
,则此脚本将中断! 在这种情况下,请进行相应调整。
const migrateImages = async(images) =>
// beware! if your ids contain the string 'sm', adjust the string replacement accordingly!
const updateMutations = _.chain(images)
.map(image => ( id: image.id, name: image.name.replace('sm', 'lg')))
.map(image => `
$image.id: updateImage(id: "$image.id", name: "$image.name")
id
name
`)
.value()
.join('\n')
const result = await client.mutate(`
$updateMutations
`)
console.log(`Updated $Object.keys(result).length images`)
console.log(result)
就是这样。如果您必须更新数千张图像,则将突变分批处理可能比在一个请求中批处理所有图像要好。请注意 GraphQL 服务器上的 mutations run sequentially。
运行迁移
目前,我建议使用以下工作流程来运行迁移:
克隆您的项目 在克隆项目上运行迁移脚本 验证迁移是否成功运行。仔细检查:) 在您的原始项目上运行迁移您可以找到代码和更多说明here。
虽然这种方法非常适合像您的示例中那样简单的迁移,但它并不适合所有情况。我们已经在考虑为这个用例创建一个集成的体验,例如在您的 Graphcool 项目中进行交互式迁移,以及模拟迁移、检查等。如果您有任何建议,请通过Slack 告诉我。
【讨论】:
以上是关于如何使用 graphql 更新集合中的所有记录的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有 Mongoose 和 ES6 承诺的 Graphql 中的 find 来解析多条记录
如何使用graphql将mongodb中多个集合中的数据传递到1个反应表
如何在两个字段 prisma-graphql 中使用相同的生成 ID