使用MongoDB进行批量API的结果分页

时间:2018-09-25 14:05:42

标签: mongodb rest api pagination

如何使用MongoDB对批量API进行结果分页?

API端点(仅针对上下文):

/team/listTeamsForUsers

输入:

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

一个用户可以与多个团队相关联。因此,API需要能够基于pageSizepageIndex对结果进行分页。

单个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 :(得分:0)

假设:

  • 我想一个用户可以是多个团队的成员,而一个团队有多个成员。因此,用户和团队之间存在多对多的关系。
  • 我进一步假设您有一个从userId映射到teamId的联结表,以便为上述关系建模。

表结构:

  • 用户表: id |名称
  • 团队表: id |名称
  • UsersTeam: 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数据库)。