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;
我正在尝试使用 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;