使用Go中的页码和限制进行分页的良好实践是什么?

时间:2018-09-15 19:25:12

标签: mongodb go mgo

我已经使用“页码和限制”在Go中创建了分页。 Limit & Page Number are INT

然后我创建了分页:

MONGO_SESSION.Find(nil).Skip(pageNumber*limit).Limit(limit).Sort("_id").All(&RETURN_STRUCT)

一切正常。但是当我发送页码或限制为零时。默认情况下,mongo DB返回所有记录,因为没有要跳过和限制的内容。

  

所以我的问题是,在零限值和   零页号。

     

实践1:发送所有数据。不要发送错误响应。

     

实践2:发送错误响应,说“不能设置页码和限制   零”

注意:我无法硬编码限制或页码。

任何建议将不胜感激。

3 个答案:

答案 0 :(得分:2)

这个问题有些基于观点(因此对于StackOverflow来说有些偏离主题),但是我认为一些建议或一般做法可能对其他人有所帮助。因此,下面的答案是我的观点。

您作为服务器应用程序的开发人员,对服务器的安全性和安全性以及服务器资源的使用负责。作为开发人员,您应该在最小程度上信任客户。

也就是说,在客户未能(无意或有意地)指定限制时发送所有文档是处理这种情况的最糟糕方法。就像在大喊:“嘿,客户端和黑客,这是一个端点,如果您想DoS attack我的服务器,只需多次调用此端点”。

为了保护您的服务器,即使对“ limit”参数也应该有一个安全限制,因为为其设置任何值都可能是同样糟糕的:仅仅因为您强迫客户端指定限制不会保护您的服务器, “不良”客户的限制可能与1e9一样好,该限制很可能会包含您的所有文档。

我的建议是始终具有有意义的默认值安全限制。默认值应始终记录在案,安全极限并不是那么重要(但也可以记录在案)。

因此,您应该如何处理它:

  1. 如果缺少限制,则应用默认值。如果您没有默认值,只需跳过此步骤(尽管必须有充分的理由不使用/允许默认值)。

  2. 应根据安全限制检查限制。如果超过安全值,请使用安全限制(最大允许限制)。

  3. 如果服务器具有“更改权限”以更改请求的限制(例如,当缺少限制时使用默认值,或基于安全限制设置限制),服务器应将限制传达给客户端实际上是用于处理请求的。

关于高效的MongoDB分页:我只建议将Query.Skip()Query.Limit()用于“少量”文档数量。要获得可以随着文档数量“缩放”的有效分页,请查看以下问题并解答:Efficient paging in MongoDB using mgo

答案 1 :(得分:1)

我相信,分页仅应在集合大小较大的情况下使用(否则,请一次显示所有数据,而完全不要摆弄分页)。

但是,如果集合相当大,那么发送所有数据是个坏主意。

“ skip”语句还有一个附加问题(尽管它不是mongo独有的): 为了跳过N条记录,数据库必须进行全面扫描(在mongo情况下为全面收集扫描),因此获取N + 1页的结果要比N页花费更多的时间。

现在,为了处理它,有一个“技巧”: 根本不使用skip,而是“记住”最后一个文档ID(无论如何它已经被索引,并且无论如何您都按_id排序)。 然后查询将是(伪代码,因为我不讲“ Go”):

  • 对于第一个查询: Find().sort(_id).limit(limitSize)

  • 对于后续查询: Find ().where(_id > lastMemorizedId).sort(_id).limit(limitSize)

答案 2 :(得分:0)

我也面临着同样的问题。我更喜欢发送错误响应而不是显示所有数据。

因为如果DB必须发送所有数据,这对于DB来说是一项繁重的事务。在小型馆藏中,它可以正常工作,但在大型馆藏中,它会挂数据库。

因此发送错误响应。