graphql - 当我指定新的输入类型时,FaunaDB GraphiQL 将不允许我更新我的架构
问题描述
这是我试图检索的文档示例:
{
"ref": Ref(Collection("Word"), "270608756095582738"),
"ts": 1594331477980000,
"data": {
"word": "ablatitious",
"letters": [
{
"letter": "a",
"occurrence": 2
},
{
"letter": "b",
"occurrence": 1
},
{
"letter": "l",
"occurrence": 1
},
{
"letter": "t",
"occurrence": 2
},
{
"letter": "i",
"occurrence": 2
},
{
"letter": "o",
"occurrence": 1
},
{
"letter": "u",
"occurrence": 1
},
{
"letter": "s",
"occurrence": 1
}
],
"length": 11
}
}
这是我的架构
type Letter @embedded {
letter: String! @unique
occurrence: Int!
}
type Word {
word: String! @unique
letters: [Letter]!
length: Int!
}
input LetterInput {
letter: String!
occurrence: Int!
}
type Query {
Word(length: Int!): Word
WordByLetters(letters: [LetterInput!]): Word
}
这是我尝试使用此架构更新架构时遇到的错误:
Schema does not pass validation. Violations:
Type mismatch: field 'letters' defined at object 'Word' has type 'Letter'. (line 19, column 17):
WordByLetters(letters: LetterInput): Word
^
如果我将类型切换LetterInput
到查询类型Letter
中WordByLetters
,我会收到此错误
Type 'Letter' is not an input type type. (line 19, column 26):
WordByLetters(letters: Letter): Word
^
所以,很明显,我需要使用一个输入类型,这是有道理的。没有意义的是这两个错误中的第一个。有人可以解释为什么吗?
解决方案
FaunaDB 开发倡导者在这里。
我不是我们的 GraphQL 专家(如果你仍然卡住,我会戳其中一位专家)。当您在 FaunaDB 的 GraphQL 中定义类似的查询时,它会尝试将属性(字母:Letter)与返回类型(Word)中的属性之一匹配。
由于该返回类型是Word
type Word {
word: String! @unique
letters: [Letter]!
length: Int!
}
您尝试将 Letter 放在那里是合乎逻辑的。但是,如果我没记错的话,它应该更准确,这意味着它必须是 [ 字母 ]。但是,由于 Letter 是一种类型,因此您必须提供一个 ID 而不是实际的 Letter 对象。您可以尝试定义:
WordByLetters(letters: [ ID ] ): Word
相反,但老实说,我不确定您是否可以在参数中放置数组。而且由于您实际上需要的是:
WordByLetters(letters: ID ): Word
如果我没记错的话,我们并不真正支持 atm。但是,您可以做的是不将字母定义为嵌入,连接到正确的字母(而不是每次都嵌入它们)。然后,您还将稍微更改架构以具有多对多关系:
type Letter {
letter: String! @unique
occurrence: Int!
words: [ Word! ]!
}
您可以预定义所有字母,以便轻松访问这些字母的 ID。如果你这样做(我认为这不适用于嵌入式,但我不是 100% 确定)你可以通过字母找到单词:
type Query {
findLetterByID(id: ID!): Letter
}
这是一个已经由 FaunaDB 定义的查询(至少如果不嵌入 Letters,我几乎没有使用嵌入自己的东西,因此我不确定一些嵌入的东西)。或者你可以定义:
type Query {
findLetter(letter: String!): Letter
}
然后您可以通过以下方式获取单词:
query GetWordsByLetter {
findLetter(_size: 6, letter: "a"){
data {
words {
...
}
}
}
}
如果这对您不起作用,您可能希望在查询上指定一个解析器,该解析器将为您生成一个用户定义的函数。这需要您深入研究 FQL,因为 UDF 是在 FQL 中指定的,但它会释放更多的可能性。
(解析器文档:https ://docs.fauna.com/fauna/current/api/graphql/directives/d_resolver )
推荐阅读
- azure - Azure Kubernetes 服务中 PVC 的读写权限问题
- android - React Native - “绝对”位置和“zIndex”在Android上不起作用
- powershell - Invoke-Pester -OutputFile 和 -OutputFormat 是旧参数集的成员
- variables - 解决多个变量组中的 Azure YAML Pipeline 重叠变量名称
- python - 为 Django 翻译设置 URL
- python - 将字典字典转换为具有数据类型的数据框
- python - 如何使用 BSON (Python) 从 MongoDB 中检索存储的数据?
- python - 如何从包含所有集合组合的项目集创建熊猫数据框?
- flutter - 为什么驾驶室我在模拟器上看不到我的小部件?
- python - 给定子兴趣级别的python分组方式