Как отфильтровать список / запросы с помощью операторов AND / OR AWS Amplify JavaScript GraphQL - PullRequest
1 голос
/ 25 марта 2020

Я новичок в использовании AWS Amplify и GraphQL. Также только начали создавать приложение React Native - это очень весело!

У меня есть таблица, называемая схемой 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
}

В файле запросов, сгенерированном с помощью ampify, у меня есть функция 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
    }
  }
`;

Я пытаюсь отфильтровать это по условию, например, я хотел бы получить список всех периодов времени, где идентификаторы равны 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. Было бы лучше в случае использования a для l oop и вызова

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

или было бы лучше получить весь список и отфильтровать его сам? И лучше я имею в виду эффективность - может быть, это зависит от количества данных, которые будут перечислены в таблице TimePeriod (если много записей получат одну за другой из БД, если небольшое количество записей получит все и отфильтрует их?)

1 Ответ

1 голос
/ 25 марта 2020

Привет всем, кто интересуется этим вопросом - после многих исследований я обнаружил, что его можно достичь следующим образом:

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

, чтобы выяснить, что вы можете делать с помощью операций И ​​и ИЛИ с GraphQL List вам нужно аналогичное определение в ваших файлах

input ModelTimePeriodFilterInput {
  id: ModelIDInput
  name: ModelStringInput
  startYear: ModelStringInput
  endYear: ModelStringInput
  and: [ModelTimePeriodFilterInput]
  or: [ModelTimePeriodFilterInput]
  not: ModelTimePeriodFilterInput
}

, которые должны находиться в бэкэнде / api / projectname / build / schema.graphql

Это означает, что аналогичным образом вы Можно написать И и ИЛИ фильтры. Надеюсь, это поможет - я sh AWS Документация облегчила понимание

Если у вас есть похожий вопрос, но вы не можете найти здесь ответ, может быть, это сообщение поможет - GraphQL: Фильтровать данные в массив

...