Как выполнить фильтрацию в клиенте AWS Amplify GraphQL

Я пытаюсь реализовать фильтр GraphQL с помощью Amplify GraphQL Client. Я получил список задач и хотел получить список задач, статус которых завершен.

В документации показано только, как получить все предметы и один предмет.

const allTodos = await API.graphql(graphqlOperation(queries.listTodos));
console.info(allTodos);

Может ли кто-нибудь указать мне, как применить фильтр к listTodos, чтобы он возвращал задачи только с завершенным статусом.

Я пытался сделать следующее, но это неправильно.

API.graphql(graphqlOperation(queries.listTodos(filter: {
    status: {
        eq: "completed"
    }
})));

Как выглядит ваша схема и шаблон сопоставления запросов? Запрос listTodos принимает входные данные фильтра или что-то в этом роде? Я знаю, что AppSync генерирует эти входные данные фильтра для вас, если вы решите начать с образца схемы.

Lisa M Shon 28.12.2018 02:27

да, код был автоматически сгенерирован генератором кода амплификации. так что он берет фильтр, лимит и следующий токен

Mohammad Harith 29.12.2018 03:06

Имейте в виду, что фильтр применяется во внешнем интерфейсе (по крайней мере, на данный момент). Вам нужно будет установить более высокий предел задач, чтобы правильно их отфильтровать.

Sebastien H. 25.05.2020 14:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
12
3
10 578
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, у меня есть ответ на ваш вопрос, но у меня также есть аналогичный вопрос относительно запросов AWS Amplify codegen, мутаций и т. д. Если вы посмотрите на код, который был сгенерирован внутри папки ~/graphql, вы найдете файл декларации, похожий на к этому:

export const listOrganizations = `query ListOrganizations(
  $filter: ModelOrganizationFilterInput
  $limit: Int
  $nextToken: String
) {
  listOrganizations(filter: $filter, limit: $limit, nextToken: $nextToken) {
    items {
      id
      name
      address
    }
    nextToken
  }
}
`;

Вы можете видеть здесь, что первый параметр запроса ListOrganizations (в вашем случае запрос ListTodos) принимает первый аргумент filter: $filter. До сих пор я понял, что вы можете изменить этот запрос, выполнив следующие действия ...

API.graphql(graphqlOperation(queries.listTodos, {
    filter: {
        status: {
            eq: "completed"
        }
    }
})));

Это должно отфильтровать все Todos, кроме тех, у которых их status равен completed. Проблема, с которой я столкнулся, заключается в том, что я хочу включить различные уровни управления доступом, чтобы любой пользователь с группой пула пользователей Cognito Admin мог просматривать @model, а также @owner. И мне удалось заставить все это работать с помощью преобразователя @auth, но теперь моя проблема в том, что на некоторых экранах я хочу отображать только определенные объекты, которые являются owner этого объекта, и поскольку я также являюсь Admin, API по умолчанию получить мне все. Я хочу использовать этот @filter или ModelOrganizationFilterInput, чтобы предоставлять мне данные только там, где я являюсь владельцем. Я нашел единственный способ сделать это - добавить поле owner в мою схему, но тогда API всегда предоставляет поле владельца, и я хочу отфильтровать это поле.

Единственная документация, которую я могу найти о методах aws-amplify, API и graphqlOperation, находится здесь: https://aws-amplify.github.io/docs/js/api, но примеров немного, и они не во многом показывают, как API работает на клиенте. Я застрял.

Привет, @SuperVeetz, удалось ли решить проблему? Что касается фильтра, который вы предложили, он хорошо работает для поля со строковым типом, но как насчет поля с типом объекта JSON.

Mohammad Harith 07.01.2019 09:39

Привет @MohammadHarith, честно говоря, я не совсем уверен, я бы предположил, что если ваше время объекта было вложенным, то вы могли бы сделать что-то вроде filter: { myObj { someProp { eq: "somevalue" } } }, это может сработать, может нет. Я столкнулся с более серьезной проблемой, которая заключается в том, как обеспечить безопасность на основе групп, а теперь как фильтровать по безопасности на основе групп ... т.е. Преобразование @auth объявляет динамические или статические группы безопасности, могу ли я фильтровать результаты по имени группы или по тому, содержится ли данное имя пользователя внутри группы пользователей.

SuperVeetz 07.01.2019 18:25

да, это не работает, поле имеет тип AWSJSON и возвращается как одна длинная строка, поэтому я просто добавил новое поле, чтобы указать элемент из объекта и использовать предложенную ранее фильтрацию, которая хорошо работает в моем случае. Спасибо!!

Mohammad Harith 09.01.2019 03:52

Привет, @SuperVeetz, я снова застрял, на этот раз мне нужно отфильтровать задачи со статусом завершено и ожидает рассмотрения. Как я могу этого добиться? Я пробовал status: { eq: ["completed","pending"] }, но не работает.

Mohammad Harith 24.01.2019 15:38

Привет, Мохаммед, буду честен, я сам еще не сталкивался с этой проблемой, но я считаю, что вы можете использовать AND {eq: "completed" ..}, {eq: "pending"} .. Я считаю для этого есть синтаксис, но я еще не уверен на 100%, что это такое. Проверьте документацию по graphql.

SuperVeetz 25.01.2019 01:55

Другие вопросы по теме