如何使用 AND/OR 运算符过滤 List/Queries AWS Amplify JavaScript GraphQL
How to Filter List/Queries With AND/OR operators AWS Amplify JavaScript GraphQL
我刚开始使用 AWS Amplify 和 GraphQL。
也刚刚开始构建 React Native App——这很有趣!
我有一个名为 TimePeriods 的 table 架构,它看起来像这样
type TimePeriod @model {
id: ID!
name: String!
startYear: String!
endYear: String!,
artworks: [ArtWorkTimePeriod] @connection (name: "TimePeriodArtWorks") #Many to Many Relationship
artists: [ArtistTimePeriod] @connection (name: "TimePeriodArtists") #Many to Many Relationship
}
在 amplify 生成的查询文件中,我有一个名为 listTimePeriods 的函数。
export const listTimePeriods = /* GraphQL */ `
query ListTimePeriods(
$filter: ModelTimePeriodFilterInput
$limit: Int
$nextToken: String
) {
listTimePeriods(filter: $filter, limit: $limit, nextToken: $nextToken) {
items {
id
name
startYear
endYear
artworks {
nextToken
}
artists {
nextToken
}
}
nextToken
}
}
`;
我想做的是按条件过滤它,例如我想获取 ID 等于 1、2 或 3 的所有时间段的列表。
我假设它可以通过以下方式完成
export async function GetTimePeriodsByIds(idArr=[]){
let filter = {
id: {
eq: [1,2,3]
}
};
return await API.graphql(graphqlOperation(listTimePeriods, {limit: 20, filter:filter}));
}
但我认为你做不到。如果您对此有任何解决方案,那将意义重大 - 即使只是像
这样的洞察力
- 如果它根本不起作用 - 他们是否有任何理由决定不实施它?
在这种情况下使用for循环并调用
会不会更好
等待API.graphql(graphqlOperation(getTimePeriod, {id: id}));
还是获取整个列表并自己过滤掉会更好?更好的意思是效率 - 也许这取决于将在 TimePeriod table 中列出的数据数量(如果很多条目然后从数据库中一个一个地获取,如果少量条目全部获取并过滤掉?)
大家好,正在研究这个问题 - 经过大量研究,我发现可以这样实现:
let filter = {
or: [
{
id: {eq:1}
},
{
id: {eq:2}
}]
};
return await API.graphql(graphqlOperation(listTimePeriods, {limit: 20, filter:filter}));
为了找出您可以使用 GraphQL List 的 AND 和 OR 操作做什么,您需要在文件中进行类似的定义
input ModelTimePeriodFilterInput {
id: ModelIDInput
name: ModelStringInput
startYear: ModelStringInput
endYear: ModelStringInput
and: [ModelTimePeriodFilterInput]
or: [ModelTimePeriodFilterInput]
not: ModelTimePeriodFilterInput
}
应该位于 backend/api/projectname/build/schema.graphql
这意味着您可以用类似的方式编写 AND 和 OR 过滤器。
希望这会有所帮助 - 我希望 AWS 文档让这更容易理解
如果您有类似的问题但在这里找不到答案,也许这篇 post 会有所帮助 -
您可以创建类似于以下的辅助函数:
const searchArray = [1,2,3,4,5]
let fieldName = "id";
let filterMembers = searchArray.map((item)=> JSON.parse(`{"${fieldName}":{"eq":${item}}}`));
let filter = {or:filterMembers};
并将过滤器对象用作查询参数。
我刚开始使用 AWS Amplify 和 GraphQL。 也刚刚开始构建 React Native App——这很有趣!
我有一个名为 TimePeriods 的 table 架构,它看起来像这样
type TimePeriod @model {
id: ID!
name: String!
startYear: String!
endYear: String!,
artworks: [ArtWorkTimePeriod] @connection (name: "TimePeriodArtWorks") #Many to Many Relationship
artists: [ArtistTimePeriod] @connection (name: "TimePeriodArtists") #Many to Many Relationship
}
在 amplify 生成的查询文件中,我有一个名为 listTimePeriods 的函数。
export const listTimePeriods = /* GraphQL */ `
query ListTimePeriods(
$filter: ModelTimePeriodFilterInput
$limit: Int
$nextToken: String
) {
listTimePeriods(filter: $filter, limit: $limit, nextToken: $nextToken) {
items {
id
name
startYear
endYear
artworks {
nextToken
}
artists {
nextToken
}
}
nextToken
}
}
`;
我想做的是按条件过滤它,例如我想获取 ID 等于 1、2 或 3 的所有时间段的列表。 我假设它可以通过以下方式完成
export async function GetTimePeriodsByIds(idArr=[]){
let filter = {
id: {
eq: [1,2,3]
}
};
return await API.graphql(graphqlOperation(listTimePeriods, {limit: 20, filter:filter}));
}
但我认为你做不到。如果您对此有任何解决方案,那将意义重大 - 即使只是像
这样的洞察力- 如果它根本不起作用 - 他们是否有任何理由决定不实施它?
在这种情况下使用for循环并调用
会不会更好等待API.graphql(graphqlOperation(getTimePeriod, {id: id}));
还是获取整个列表并自己过滤掉会更好?更好的意思是效率 - 也许这取决于将在 TimePeriod table 中列出的数据数量(如果很多条目然后从数据库中一个一个地获取,如果少量条目全部获取并过滤掉?)
大家好,正在研究这个问题 - 经过大量研究,我发现可以这样实现:
let filter = {
or: [
{
id: {eq:1}
},
{
id: {eq:2}
}]
};
return await API.graphql(graphqlOperation(listTimePeriods, {limit: 20, filter:filter}));
为了找出您可以使用 GraphQL List 的 AND 和 OR 操作做什么,您需要在文件中进行类似的定义
input ModelTimePeriodFilterInput {
id: ModelIDInput
name: ModelStringInput
startYear: ModelStringInput
endYear: ModelStringInput
and: [ModelTimePeriodFilterInput]
or: [ModelTimePeriodFilterInput]
not: ModelTimePeriodFilterInput
}
应该位于 backend/api/projectname/build/schema.graphql
这意味着您可以用类似的方式编写 AND 和 OR 过滤器。 希望这会有所帮助 - 我希望 AWS 文档让这更容易理解
如果您有类似的问题但在这里找不到答案,也许这篇 post 会有所帮助 -
您可以创建类似于以下的辅助函数:
const searchArray = [1,2,3,4,5]
let fieldName = "id";
let filterMembers = searchArray.map((item)=> JSON.parse(`{"${fieldName}":{"eq":${item}}}`));
let filter = {or:filterMembers};
并将过滤器对象用作查询参数。