GraphQL DynamoDb筛选器列表字段

GraphQL DynamoDb筛选器列表字段,graphql,amazon-dynamodb,aws-amplify,Graphql,Amazon Dynamodb,Aws Amplify,我正在尝试使用一个使用AWS Amplify的GraphQLAPI来列出我存储在DynamoDB中的书籍,这些书籍在一个列表类型的字段上进行过滤 模式 id: ID! title: String authorId: String genre: [String] ... } 我正在这样做: API.graphql(graphqlOperation(listBooks, { filter: { genre: {

我正在尝试使用一个使用AWS Amplify的GraphQLAPI来列出我存储在DynamoDB中的书籍,这些书籍在一个列表类型的字段上进行过滤

模式

  id: ID!
  title: String
  authorId: String
  genre: [String]
  ...
}
我正在这样做:

API.graphql(graphqlOperation(listBooks, {
            filter: {
                genre: {
                    contains: category,
                }
            },
        }))
但是,返回的唯一书籍是具有单个元素且该元素与类别匹配的书籍,例如,当类别为“History”时,这将匹配

[{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;
/**
*@desc使用nextToken递归获取列表查询中的所有项
*@param{Object}从正在使用的cda graphql查询查询对象。
*@param{Object}variables要传递给查询的变量。
*@返回从查询接收的所有项的{Array}数组。
*/
从“aws amplify”导入{API,graphqlOperation};
异步函数fetchItemsNextToken({query,variables,limit}){
常量结果=[];
while(results.lengthk.includes('list'));
const res=data[key];//res={items:[],nextToken:'}
结果:推送(…res.items);
如果(!res.nextToken)中断;
//eslint禁用下一行无参数重新分配
variables.nextToken=res.nextToken;
}
返回新承诺((解决、拒绝)=>{
决心(结果);
});
}
导出默认的fetchItemsNextToken;