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

时间:2019-03-13 00:50:51

标签: graphql aws-appsync aws-amplify

我有一个由Amplify从基本模式生成的Appsync API。在Article模型上,category字段嵌套在metadata字段中。我想构建一个查询,该查询提供按类别过滤的文章列表。对我来说,目前尚不清楚如何根据嵌套值进行过滤...我已经看到similar questions,但类似的答案却没有用。

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 个答案:

答案 0 :(得分:1)

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

您将需要增加ModelArticleFilterInput类型以包括类别字段。假设商品表中的元数据字段由DynamoDB地图支持,则可以基于地图值进行过滤。当filter参数中有类别值时,您将需要修改listArticles解析器的“请求映射模板” VTL以添加包含类似metadata.category = :category之类的过滤器表达式。