Size: a a a

GraphQL — русскоговорящее сообщество

2021 May 31

Ɖ

Ɖrēw in GraphQL — русскоговорящее сообщество
Меня скорее интересует именно со стороны MongoDB, каким образом лучше осуществлять саму пагинацию, особенно с before/last. Играться с сортировкой чтобы получить reversed коллекцию и дальше брать обратную сортировку?
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Да обратную, причем в фильтр добавлять значение из последнего курсора.
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Хотя соврал
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Я не использую обратную сортировку
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Для last
источник

Ɖ

Ɖrēw in GraphQL — русскоговорящее сообщество
А как вы делаете?
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
В зависимости от сортировки использую разные квери для before/after. Например https://github.com/graphql-compose/graphql-compose-connection/blob/master/src/__mocks__/User.ts#L242
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
И самое важное, если вы сортируете по двум полям, например AGE_ID_DESC, то значения этих двуй полей у меня записываются в сам курсор, к каждой записи. Иначе у вас не будет точек для фильтра, за что зацепиться, чтобы дернуть следующую порцию данных.
источник

Ɖ

Ɖrēw in GraphQL — русскоговорящее сообщество
Да, да, я раньше делал пагинацию для Elasticsearch подобную и с этим сталкивался
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Ну если вложенные сущности легко фильтровать напрямую из базы, то проблем не вижу.

А вот через ДатаЛоадер - звучит странно, они же просто по id дергают данные из базы. Исхитриться можно, но памяти будет жрать будь здоров, если выборки большие, и клиент где-то в середине дата-сета решит покапаться.

Лучше базу проектировать так, чтоб удобно было читать данные, если их много. А если мало, то конечно можно попробовать что-то накастылить на дата-лоадерах
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
В эластике есть свой курсорный поиск. Они состояние и выборку у себя на сервере хранят. Там полегче и побыстрее всё это работает.

С монгой же, прям мегооптимально как на эластике не получится, но тоже вполне сносно можно сделать.

На недельку правда надо провалиться, чтоб все кейсы правильно разобрать, особенно когда вам прилетает 3 параметра after, last, first - надо взять дата-сет после курсора, получить последние last элементов, и уже из них дернуть первые first элементов. Вроле не так сложно, но я раза с 3го только правильно по спеке реализовал такие кейсы.
источник

Ɖ

Ɖrēw in GraphQL — русскоговорящее сообщество
Знаю, но мне тогда удобнее было через search_after делать
источник

Ɖ

Ɖrēw in GraphQL — русскоговорящее сообщество
Как раз для last делал обратную сортировку, не очень красиво вышло, но подошло
источник

Ɖ

Ɖrēw in GraphQL — русскоговорящее сообщество
По поводу последнего - да, это самое сложное, с чем мне придется столкнуться
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
А по другому эластик и не умеет. Унего курсоры только в одну сторону смотрят.
источник

Ɖ

Ɖrēw in GraphQL — русскоговорящее сообщество
Да, там вроде 3 разных варианта пагинации и подошел только этот
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Кстати если вы хотите курсорную пагинацию использовать на клиентской стороне (не в админках). То будьте аккуратны, всё это добро не любят поисковики и вы сильно просядите по SEO-оптимизации.
источник

Ɖ

Ɖrēw in GraphQL — русскоговорящее сообщество
@nodkz что делать в случае, если заданы оба after и before?
источник

Ɖ

Ɖrēw in GraphQL — русскоговорящее сообщество
В спецификации я не нашел четкого определения такого кейса
источник

P@

Pavel @nodkz in GraphQL — русскоговорящее сообщество
Ошибку вроде как.

А я же говорил про first, last. Но в любом млучае спеку придется раз 5 перечитывать, я уже не хочу ворошить прошлое 3хлетней давности. Что-тт тут обсуждалось https://github.com/graphql-compose/graphql-compose-connection/issues/7
источник