14

我是使用 AWS Amplify 和 GraphQL 的新手。也刚刚开始构建 React Native App - 这很有趣!

我有一个名为 TimePeriods 模式的表,它看起来像这样

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
}

在放大生成的查询文件中,我有一个名为 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}));
}

但我认为你做不到。如果您对此有任何解决方案,那将意味着很多 - 甚至只是像这样的洞察力

  1. 如果它根本不起作用 - 他们有什么理由决定不实施它吗?
  2. 在使用for循环并调用的情况下会更好吗

    等待 API.graphql(graphqlOperation(getTimePeriod, {id: id}));

还是自己获取整个列表并将其过滤掉会更好?更好的意思是效率 - 也许它取决于将在 TimePeriod 表中列出的数据数量(如果有很多条目然后从数据库中一一获取,如果少量条目全部获取并将其过滤掉?)

4

2 回答 2

22

大家好,研究这个问题的人 - 经过大量研究,我发现它可以这样实现:

     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 文档使这更容易理解

如果您有类似的问题但在这里找不到答案,也许这篇文章会有所帮助 - GraphQL: Filter data in an array

于 2020-03-25T17:38:12.070 回答
0

您可以创建类似于以下内容的辅助函数:

const searchArray =  [1,2,3,4,5]
let fieldName = "id";
    
let filterMembers = searchArray.map((item)=> JSON.parse(`{"${fieldName}":{"eq":${item}}}`));
let filter = {or:filterMembers};

并使用过滤器对象作为查询参数。

于 2021-08-16T17:28:04.150 回答