首页 > 解决方案 > 当我指定新的输入类型时,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到查询类型LetterWordByLetters,我会收到此错误

Type 'Letter' is not an input type type. (line 19, column 26):
  WordByLetters(letters: Letter): Word
                         ^

所以,很明显,我需要使用一个输入类型,这是有道理的。没有意义的是这两个错误中的第一个。有人可以解释为什么吗?

标签: graphqlgraphiqlfaunadb

解决方案


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 )


推荐阅读