Appsync & GraphQL: как отфильтровать список по вложенному значению - PullRequest
1 голос
/ 13 марта 2019

У меня есть API Appsync, сгенерированный Amplify из базовой схемы. В модели Article поле category вложено в поле metadata. Я хочу построить запрос, который предоставляет список статей, отфильтрованных по категориям. Мне не понятно, как фильтровать вложенное значение ... Я видел похожих вопросов , но аналогичный ответ не сработал.

Схема преобразования AWS GraphQL

type Article @model {
  id: ID!
  title: String!
  description: String!
  text: String!
  metadata: ArticleMetadata!
}

type ArticleMetadata {
  category: Category!
  lastModified: String!
  creationDate: String!
}

enum Category {
  javascript
  java
  ruby
  python
  haskell
}

Запрос сгенерированного списка

export const listArticles = `query ListArticles(
  $filter: ModelArticleFilterInput
  $limit: Int
  $nextToken: String
) {
  listArticles(filter: $filter, limit: $limit, nextToken: $nextToken) {
    items {
      id
      title
      description
      text
      metadata {
        category
        lastModified
        creationDate
      }
    }
    nextToken
  }
}
`;

Сбой запроса фильтра

query listArticlesByCategory($category: String!) {
  listArticles(filter: {category: {eq: $category}}) { 
    items {
      title
      description
      text
      metadata {
        category
        creationDate
        lastModified
      }
    }
  }
}

Ошибка консоли Appsync гласит, что category в filter: {category: ... } является неизвестным полем.

1 Ответ

1 голос
/ 15 марта 2019

По умолчанию Amplify codegen будет работать только на фильтрах верхнего уровня.Вы можете расширить это, чтобы включить фильтры для атрибутов, вложенных в ArticleMetadata.

Вам нужно будет дополнить тип ModelArticleFilterInput, чтобы включить поле категории.Предполагая, что поле метаданных в таблице статей опирается на карту DynamoDB, вы можете выполнять фильтрацию по значению карты.Вам нужно будет изменить VTL шаблона запроса сопоставления listArticles, чтобы добавить выражение фильтра, содержащее что-то вроде metadata.category = :category, если в аргументе фильтра есть значение для категрии.

...