FaunaDB-如何批量更新单个graphQL变异中的条目列表?
我想批量更新faunaDB中graphQL突变的条目列表。 输入数据是来自外部来源的冠状病毒病例列表。它将经常更新。如果collectio中存在条目名称,则该变异应更新现有条目,如果不存在,则应创建新条目 当前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 {
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只会接受您已经编写了它,并且