GraphQL DynamoDb 过滤器列表字段

GraphQL DynamoDb filter List field

我正在尝试使用 graphQL API 使用 AWS Amplify 来列出我存储在 DynamoDB 中的书籍,该书籍在列表类型的字段上过滤。

架构

  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 属性,所以看起来它支持这个。

我不确定我做错了什么,欢迎任何意见。

事实证明我忽略了在有效负载中使用 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;