Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FaunaDB-如何批量更新单个graphQL变异中的条目列表?_Graphql_Bulk_Mutation_Faunadb - Fatal编程技术网

FaunaDB-如何批量更新单个graphQL变异中的条目列表?

FaunaDB-如何批量更新单个graphQL变异中的条目列表?,graphql,bulk,mutation,faunadb,Graphql,Bulk,Mutation,Faunadb,我想批量更新faunaDB中graphQL突变的条目列表。 输入数据是来自外部来源的冠状病毒病例列表。它将经常更新。如果collectio中存在条目名称,则该变异应更新现有条目,如果不存在,则应创建新条目 当前GRAPHQL突变 mutation UpdateList($data: ListInput!) { updateList(id: "260351229231628818", data: $data) { title cities { data {

我想批量更新faunaDB中graphQL突变的条目列表。 输入数据是来自外部来源的冠状病毒病例列表。它将经常更新。如果collectio中存在条目名称,则该变异应更新现有条目,如果不存在,则应创建新条目

当前GRAPHQL突变

mutation UpdateList($data: ListInput!) {
  updateList(id: "260351229231628818", data: $data) {
    title
    cities {
      data {
        name
        infected
      }
    }
  }
}
GRAPHQL变量

{
  "data": {
    "title": "COVID-19",
    "cities": {
      "create": [
        {
          "id": 22,
          "name": "Warsaw",
          "location": {
            "create": {
              "lat": 52.229832,
              "lng": 21.011689
            }
          },
          "deaths": 0,
          "cured": 0,
          "infected": 37,
          "type": "ACTIVE",
          "created_timestamp": 1583671445,
          "last_modified_timestamp": 1584389018
        }
      ]
    }
  }
}
模式

type cityEntry {
  id: Int!
  name: String!
  deaths: Int!
  cured: Int!
  infected: Int!
  type: String!
  created_timestamp: Int!
  last_modified_timestamp: Int!
  location: LatLng!
  list: List
}

type LatLng {
  lat: Float!
  lng: Float!
}

type List {
  title: String!
  cities: [cityEntry] @relation
}

type Query {
  items: [cityEntry!]
  allCities: [cityEntry!]
  cityEntriesByDeathFlag(deaths: Int!): [cityEntry!]
  cityEntriesByCuredFlag(cured: Int!): [cityEntry!]
  allLists: [List!]
}
每次变异都会产生新的重复。
在单个突变中更新列表的最佳方法是什么?

我为延迟道歉,我不确定丢失的信息到底是什么,因此我首先评论:)

模式 具有参数的架构部分的示例:

型突变{
注册(电子邮件:String!,密码:String!):Account!@resolver
登录(电子邮件:String!,密码:String!):String!@resolver
}
在FaunaDB中导入此类模式时,将提供占位符函数

UDF参数

正如您所看到的,该函数所做的一切都是中止,并显示仍需实现该函数的消息。该实现从一个Lambda开始,该Lambda接受参数,这些参数必须与您在解析器中定义的参数匹配

Query(Lambda(['email','password'],
…功能体。。。
))
使用参数是通过Var完成的,在本例中,这意味着Var('email')或Var('password')。例如,在我的特定情况下,我们将使用传入的电子邮件通过电子邮件获取帐户,并使用密码传递到登录函数,该函数将返回一个秘密(我在此处选择的原因是GraphQL解析器的返回值必须是有效的GraphQL结果(例如,纯JSON)

Query(Lambda(['email','password'],
挑选(
[“秘密”],
登录(匹配(索引('accountsByEmail')、变量('email')){
密码:Var('password')
})
)
))
通过GraphQL调用UDF解析器 最后,调用时如何传递参数?GraphQL游乐场应该清楚这一点,因为它将为您提供文档和自动完成。例如,在模式导入后,自动生成的GraphQL文档会告诉我:

这意味着我们可以这样称呼它:

login{
登录(
电子邮件:“
密码:“
)
}
批量更新 对于批量更新,您还可以将值列表传递给用户定义函数(UDF)。假设我们希望通过UI将特定团队中的多个帐户组合在一起,因此希望同时更新多个帐户

我们的模式中的变异如下所示(GraphQL中的ID类似于字符串)

type Mutation{updateAccounts(accountRefs:[ID]):[ID]!@resolver}
然后,我们可以通过提供从FaunaDB接收到的id来调用突变(如果您混合使用FQL和GraphQL,则使用字符串而不是Ref,如果您只使用GraphQL,则不用担心)

突变{
updateAccounts(accountRefs:[“265317328423485952”、“265317336075993600”])
}
与之前一样,我们必须填写FaunaDB生成的用户定义函数。只接收数组并返回数组的骨架函数如下所示:

Query(Lambda(['arr']),
Var('arr')
))
有些人可能已经看到了一种更简单的语法,并且很想使用这种语法:

Query(Lambda(arr=>arr))
但是,当传入数组时,这个目前不适用于GraphQL,这是一个已知的问题,将被修复。 下一步是实际循环数组。FQL不是声明性的,它从函数式语言中获得灵感,这意味着您只需使用“map”或“foreach”就可以做到这一点

Query(Lambda([“accountArray”],
映射(变量(“accountArray”),
Lambda(“账户”,Var(“账户”))
))
现在,我们在列表上循环,但不做任何操作,因为我们只是在地图主体中返回帐户。我们现在将更新帐户,并在上面设置一个值“teamName”。为此,我们需要使用update函数,该函数采用FaunaDB引用。GraphQL向我们发送字符串而不是引用,因此我们需要将这些ID字符串转换为引用,如下所示:

Ref(集合(“账户”),Var(“账户”)
如果我们将其放在一起,我们可以向帐户ID列表添加一个额外属性,如下所示:

Query(Lambda([“accountArray”],
映射(变量(“accountArray”),
Lambda(“账户”,
做(
更新(
参考(收款(“账户”),风险值(“账户”),
{数据:{teamName:“非常棒的实时编码器”}
),
风险值(“账户”)
)
)
)
))
在映射的末尾,我们只需使用Var(“account”)再次返回帐户的ID,以便返回纯JSON的内容,否则我们将返回FaunaDB ref,它们不仅仅是JSON,而且不会被GraphQL调用接受

传递更复杂的类型。 有时您希望传入更复杂的类型,比如说我们有一个简单的todo模式

键入待办事项{
标题:字符串!
完成:布尔!
}
我们希望将具有特定标题的TODO列表的完成值设置为true。我们可以在FaunaDB生成的扩展模式中看到TodoInput

如果您看到扩展模式,您可能会想,“嘿,这正是我所需要的!”但您在编写突变时无法访问它,因为您在创建时没有该模式的一部分,因此不能只编写:

type Mutation{updateTodos(todos:[TodoInput]):Boolean!@resolver}
因为它将返回以下错误。

但是,我们可以自己将它添加到模式中。Fanua只会接受您已经编写了它,并且