Я новичок в GraphQL и в настоящее время пытаюсь реализовать его в своем проекте nodejs с mongodb в качестве моей базы данных (с использованием mongoose). У меня настроена схема, а также преобразователи, которые обрабатывают связь с базой данных, и все работает нормально. Используя инструмент graphiql, я могу делать запросы и изменять, и все отлично сохраняется в базе данных. Сейчас я пытаюсь реализовать фильтрацию и сортировку в GraphQL API, но я запутался. Я понимаю, что могу передавать аргументы своим запросам, а затем обращаться к ним в моих преобразователях и писать логику, чтобы поместить их в мои запросы mongodb. Но мне приходится определять входные данные в моей схеме GraphQL для каждого возможного фильтра, который можно применить. Например, часть моей схемы позволяет мне фильтровать продукты по их цене:
type Product {
_id: ID!
name: String!
price: Float!
}
input ProductFilterInput {
price: IntFilter
}
input IntFilter {
eq: Float
gt: Float
gte: Float
lt: Float
lte: Float
between: [Float]
}
type RootQuery {
products(filters: ProductFilterInput): [Product]
}
Затем в моем преобразователе я должен обрабатывать каждый возможный аргумент фильтра по-разному. Если аргумент запроса был "{price: {gt: 10}}", я должен сказать что-то вроде
"Product.find ({price: {$ gt: 10}})".
Мне кажется безумием писать кучу различных проверок и логики в резолвере для каждого возможного фильтра. Когда я исследую это, я могу найти ресурсы по использованию аргументов для фильтрации самих запросов GraphQL, но я изо всех сил пытаюсь найти документацию о том, как писать схемы и преобразователи. Возможно, я что-то упускаю из виду, но есть ли способ написать схемы и преобразователи таким образом, чтобы мне не приходилось явно определять каждый фильтр, а затем снова явно переводить каждый фильтр в преобразователе? Возможно, это способ написать преобразователь, чтобы я мог просто вставить аргумент в метод «find» мангуста, и он понял, о чем я спрашиваю?
Надеюсь, все это имело смысл, если вы хотите, чтобы я попытался объяснить дальше, я сделаю все, что в моих силах.
Спасибо всем, кто может помочь!
Большое спасибо! В этом больше смысла, чем то, что я пытался сделать. И это значительно упрощает написание схемы и преобразователей!
следуйте некоторым лучшим, более универсальным шаблонам / примерам построения условий [API] ... например,
where: {field: "price", condition: "gt", value: 10}
и / или «операторы», древовидные, с возможностью синтаксического анализа, конвертируемые в соответствии с вашими требованиями к базе данных / службам