PS.извините, я только что заметил, что вы заявили, что не можете изменить схему.Я оставлю его там для дальнейшего использования, но, вероятно, его нельзя применить к вашей проблеме.
Я бы предложил изменить вашу схему следующим образом.У меня недостаточно информации, если она удовлетворит ваши потребности.Но я бы предложил это.
type User {
id: Float
name: String
city: City
#for this city field there will be additional resolver binded to data loader
}
type City {
id: Float
country: String
}
Таким образом, запрос будет выглядеть следующим образом
query getUsers {
users {
id
name
city {
id
country
}
}
}
Можно использовать UserConnection из спецификации Relay, но давайте пока будем простыми.На стороне сервера вам нужно будет реализовать два средства распознавания ... сначала запрос на список пользователей, а затем преобразователь для поля города.Обратите внимание, что распознаватели имеют отдельный контекст.Во избежание проблем с N + 1 запросами и пакетных запросов к городским запросам к 1. Было бы полезно реализовать загрузчик данных для городов, чтобы уменьшить количество запросов к базе данных.Простая схема будет выглядеть следующим образом:
- Пользовательский преобразователь, извлекает пользователей и возвращает их в пользовательском преобразователе.CityId является частью полезной нагрузки для каждого использования
- Поскольку город является вторым уровнем набора выбора, вы получите каждого пользователя в первом аргументе в функции распознавателя.Вы будете использовать countryId для передачи его загрузчику данных стран
- Загрузчик данных стран будет группировать запросы для каждой страны вместе.Загрузчик данных преобразует countryIds в значения стран и возвращает их для каждого пользователя.
- Сервер GraphQL будет обрабатывать весь запрос, и каждый город будет назначен каждому пользователю
Этолучший подход, который я знаю, чтобы иметь дело с этим, и он также приведет вас к лучшей архитектуре вашей схемы, так как вы будете использовать нормализацию вашего магазина appollo, и, на мой взгляд, с этим форматом данных проще работать и во внешнем интерфейсе.Надеюсь, что я что-то не пропустил в вашем посте и эта информация будет вам полезна.Весь смысл в том, чтобы просто внедрить страну в пользователя, что приводит к проблеме запроса N + 1 и уменьшает проблему производительности проблемы N + 1 с загрузчиками данных.