【问题标题】:GraphQL DynamoDb filter List fieldGraphQL DynamoDb 过滤器列表字段
【发布时间】:2020-12-07 05:01:28
【问题描述】:

我正在尝试使用一个使用 AWS Amplify 的 graphQL API 来列出我存储在 DynamoDB 中的书籍,这些书籍按 List 类型的字段过滤。

架构

  id: ID!
  title: String
  authorId: String
  genre: [String]
  ...
}

我正在这样做:

API.graphql(graphqlOperation(listBooks, {
            filter: {
                genre: {
                    contains: category,
                }
            },
        }))

但唯一返回的书籍是具有单个元素且该元素与类别匹配的书籍,例如当类别为“历史”时,它将匹配

[{S: "History"}]

但这不会匹配

[ { "S" : "History" }, { "S" : "Politics and Social Sciences" }]

我的 ModelBookFilterInput 是这样的:

input ModelBookFilterInput {
  id: ModelIDInput
  genre: ModelStringInput
  ...
}

而且 ModelStringInput 上有 contains: String 属性,所以看起来它支持这个。

我不确定我做错了什么,感谢任何意见。

【问题讨论】:

    标签: graphql amazon-dynamodb aws-amplify


    【解决方案1】:

    原来我忽略了在有效载荷中使用nextToken。默认情况下,查询一次只会查看 10 个元素,因此开发人员有责任继续查询,直到它们有足够的匹配结果

    nextToken的使用方法示例:

    /**
     * @desc Recursively fetch all items in a list query using nextToken
     * @param {Object} query The query object from cda-graphql in use.
     * @param {Object} variables The variables to pass to query.
     * @returns {Array} Array of all items received from queries.
     */
    import { API, graphqlOperation } from 'aws-amplify';
    
    async function fetchItemsNextToken({ query, variables, limit}) {
        const results = [];
        while (results.length < limit) {
            const { data } = await API.graphql(graphqlOperation(query, variables));
            const key = Object.keys(data).find(k => k.includes('list'));
            const res = data[key]; // res = { items: [], nextToken: '' }
    
            results.push(...res.items);
            if (!res.nextToken) break;
    
            // eslint-disable-next-line no-param-reassign
            variables.nextToken = res.nextToken;
        }
        return new Promise((resolve, reject) => {
            resolve(results);
        });
    }
    
    export default fetchItemsNextToken;
    

    【讨论】:

      猜你喜欢
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2017-03-08
      • 2016-12-13
      • 2022-12-17
      • 2020-11-23
      • 2020-10-23
      相关资源
      最近更新 更多