如何解决GraphQL DynamoDb过滤器列表字段
我正在尝试通过AWS Amplify使用graphQL API来列出我存储在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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。