Appsync 和 GraphQL:如何按嵌套值过滤列表

Appsync & GraphQL: how to filter a list by nested value

我有一个由 Amplify 从基本模式生成的 Appsync API。在 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 控制台错误指出 filter: {category: ... } 中的 category 是未知字段。

默认情况下,Amplify codegen 仅在顶级过滤器上运行。您可以扩展它以包括嵌套在 ArticleMetadata 中的属性的过滤器。

您需要扩充 ModelArticleFilterInput 类型以包含类别字段。假设文章 table 中的元数据字段由 DynamoDB 映射支持,您可以根据映射值进行过滤。您将需要修改 listArticles 解析器的请求映射模板 VTL,以在过滤器参数中有类别值时添加包含类似 metadata.category = :category 的过滤器表达式。