FaunaDB GraphiQL не позволит мне обновить мою схему, когда я укажу новый тип ввода - PullRequest
0 голосов
/ 14 июля 2020

Это пример документа, который я пытаюсь получить:

  {
  "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
                         ^

Итак, ясно , Мне нужно использовать тип ввода, что имеет смысл. Что не имеет смысла, так это первая из двух ошибок. Может кто-нибудь объяснить, почему?

1 Ответ

0 голосов
/ 14 августа 2020

Здесь защитник разработчиков FaunaDB.

Я не эксперт по нашему GraphQL (я ткну одного из экспертов, если вы все еще застряли). Когда вы определяете подобные запросы в GraphQL FaunaDB, он будет пытаться сопоставить атрибут (буквы: Letter) с одним из атрибутов в возвращаемом типе (Word).

Поскольку этот возвращаемый тип - Word

type Word {
  word: String! @unique
  letters: [Letter]!
  length: Int!
}

логично, что вы пытаетесь поместить туда Letter. Однако, если я не ошибаюсь, это должно быть точнее, что означало, что это должно быть [Письмо]. Однако, поскольку Letter является типом, вам нужно будет указать идентификатор вместо фактического объекта Letter. Вместо этого вы можете попытаться определить:

WordByLetters(letters: [ ID ] ): Word

, но я, честно говоря, не уверен, можно ли размещать массивы в аргументах. И поскольку вам действительно нужно следующее:

WordByLetters(letters: ID ): Word

, который, если я не ошибаюсь, мы не поддерживаем банкомат. Однако вы можете не определять буквы как встроенные, соединять с правильными буквами (вместо того, чтобы каждый раз вставлять их). Затем вы также должны немного изменить свою схему, чтобы иметь отношение «многие ко многим»:

type Letter {
  letter: String! @unique
  occurrence: Int!
  words: [ Word! ]!
}

Вы можете заранее определить все буквы, чтобы получить легкий доступ к идентификаторам писем. Если вы это сделаете (я не думаю, что это будет работать со встроенным, но я не уверен на 100%), вы можете найти слова по буквам:

type Query {
  findLetterByID(id: ID!): Letter
}

, который является запросом, который уже определен by 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...