【问题标题】:Result pagination for bulk API with MongoDB使用 MongoDB 对批量 API 进行结果分页
【发布时间】:2018-09-25 14:05:41
【问题描述】:

使用 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.

很高兴看到这种实现的示例。

有什么建议吗?

【问题讨论】:

    标签: mongodb rest api pagination


    【解决方案1】:

    假设:

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

    表结构:

    • 用户表:id |名称
    • 团队表:id |名称
    • 用户团队:用户 ID |团队ID

    考虑到您将 userId 列表作为输入,用于分页与这些用户关联的团队的 SQL sn-p 如下所示(请注意,我没有测试下面的 sn-p)。

    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 数据库)。

    【讨论】:

    • 感谢 alexrolea。我更关心这里的反应。如果 limit = 10 并且第一个 userId 关联了 10 个团队,则达到响应限制。第二个 userId 将如何处理?
    • 如果 user1 和 user2 有 33 个不同的团队,则将返回前 10 个用于 {pageIndex:0, pageSize:10},10-20 用于 {pageIndex:1, pageSize:10},20-30 用于 {pageIndex:2, pageSize:10}{pageIndex:4, pageSize:10} 的最后 3 个。这是确保的,因为我们使用order by t.name desc,这确保了团队之间的确定性排序。这假设您在每个请求中发送用户 ID,在每个后续请求中仅修改 pageIndex
    • 这有意义吗?
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2018-10-31
    • 2012-12-21
    • 1970-01-01
    • 2023-03-18
    • 2022-12-20
    相关资源
    最近更新 更多