【问题标题】:How to Filter List/Queries With AND/OR operators AWS Amplify JavaScript GraphQL如何使用 AND/OR 运算符过滤列表/查询 AWS Amplify JavaScript GraphQL
【发布时间】:2020-07-06 07:14:56
【问题描述】:

我不熟悉使用 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 表中列出的数据数量(如果有很多条目,那么从 DB 中一一获取,如果少量条目全部获取并将其过滤掉?)

【问题讨论】:

    标签: react-native graphql aws-amplify graphql-js aws-amplify-cli


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

           let filter = {
                  or: [
                      {
                          id: {eq:1}
                      },
                      {
                          id: {eq:2}
                      }]
              };
      return await API.graphql(graphqlOperation(listTimePeriods, {limit: 20, filter:filter}));
      

      为了了解您可以使用 GraphQL 列表执行 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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      相关资源
      最近更新 更多