Я пытаюсь реализовать фильтр 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"
}
})));
да, код был автоматически сгенерирован генератором кода амплификации. так что он берет фильтр, лимит и следующий токен
Имейте в виду, что фильтр применяется во внешнем интерфейсе (по крайней мере, на данный момент). Вам нужно будет установить более высокий предел задач, чтобы правильно их отфильтровать.





Думаю, у меня есть ответ на ваш вопрос, но у меня также есть аналогичный вопрос относительно запросов 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.
Привет @MohammadHarith, честно говоря, я не совсем уверен, я бы предположил, что если ваше время объекта было вложенным, то вы могли бы сделать что-то вроде filter: { myObj { someProp { eq: "somevalue" } } }, это может сработать, может нет. Я столкнулся с более серьезной проблемой, которая заключается в том, как обеспечить безопасность на основе групп, а теперь как фильтровать по безопасности на основе групп ... т.е. Преобразование @auth объявляет динамические или статические группы безопасности, могу ли я фильтровать результаты по имени группы или по тому, содержится ли данное имя пользователя внутри группы пользователей.
да, это не работает, поле имеет тип AWSJSON и возвращается как одна длинная строка, поэтому я просто добавил новое поле, чтобы указать элемент из объекта и использовать предложенную ранее фильтрацию, которая хорошо работает в моем случае. Спасибо!!
Привет, @SuperVeetz, я снова застрял, на этот раз мне нужно отфильтровать задачи со статусом завершено и ожидает рассмотрения. Как я могу этого добиться? Я пробовал status: { eq: ["completed","pending"] }, но не работает.
Привет, Мохаммед, буду честен, я сам еще не сталкивался с этой проблемой, но я считаю, что вы можете использовать AND {eq: "completed" ..}, {eq: "pending"} .. Я считаю для этого есть синтаксис, но я еще не уверен на 100%, что это такое. Проверьте документацию по graphql.
Как выглядит ваша схема и шаблон сопоставления запросов? Запрос listTodos принимает входные данные фильтра или что-то в этом роде? Я знаю, что AppSync генерирует эти входные данные фильтра для вас, если вы решите начать с образца схемы.