如何使用 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 客户端。

首先,我们查询所有现有图像以获取它们的idname

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个反应表

如何使用变量更新graphql中的条目

如何在两个字段 prisma-graphql 中使用相同的生成 ID

GraphQL 如何使用 Nestjs 或 type-graphql 设置查询 MongoDB ref 集合

如何使用 Graphql 动态更新一个表中的多行