Разбивка результатов для массового API с MongoDB - PullRequest
0 голосов
/ 25 сентября 2018

Как работает разбиение на страницы результатов для массового API с MongoDB?

Конечная точка API (только для контекста):

/team/listTeamsForUsers

Ввод:

{
   "userIds": ["userId1", "userId2", "userId3"...],
   "options": {
       "pageSize": 10,
       "pageIndex": 0
    }
}

Пользовательможет быть связан с несколькими командами.Следовательно, API требуется возможность разбивать результаты на страницы на основе pageSize и pageIndex.

Возможно разбиение на страницы для одного userId ввода.Как поддержать разбиение на страницы для нескольких входов?

Пример использования:
User01 связан с 10 командами.
User02 связан с 20 командами.

when pageSize=10 and pageIndex=0
    Teams 1-10 related to User01 should be returned.

when pageSize=10 and pageIndex=1
    Teams 1-10 related to User02 should be returned.

when pageSize=10 and pageIndex=2
    Teams 11-20 related to User02 should be returned.

Было бы здорово увидеть примеры такой реализации.

Есть предложения?

1 Ответ

0 голосов
/ 25 сентября 2018

Допущения:

  • Я полагаю, что пользователь может быть членом нескольких команд, а команда состоит из нескольких членов.Поэтому пользователи и команды находятся во многих отношениях.
  • Я также предполагаю, что у вас есть соединительная таблица, которая отображается из userId в teamId для моделирования вышеупомянутых отношений.

Структуры таблицы:

  • Таблица пользователей: id |имя
  • Таблица команд: id |name
  • UsersTeams: userId |teamId

Принимая во внимание, что вы получаете список userId в качестве входных данных, фрагмент SQL для подкачки команд, связанных с этими пользователями, будет выглядеть следующим образом (обратите внимание, что я не тестировал приведенный ниже фрагмент).

select distinct t.name
    from team t, user u, userTeam ut
    where t.id = ut.teamId and u.id = ut.userId and u.id in (1, 2)
    order by t.name desc
    limit 0, 10;
  • Параметры, переданные в limit, - это pageIndex*pageSize и (pageIndex+1)*pagSize.
  • Параметры, переданные в in, - это userIds, полученные изконечная точка.

Хотя этот подход прост для понимания и реализации, он не обладает наилучшей производительностью.Пожалуйста, смотрите https://www.xarg.org/2011/10/optimized-pagination-using-mysql/ для оптимизации подкачки для MySQL (хотя вы, вероятно, можете перевести большую часть этого в любую базу данных SQL).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...