今天接到个需求,要求起个定时 job,顺序每天取一定数量的 mongo 数据,但每天的数据不能重复,且每天的取用量不同。
假设今天取 100 个,明天从第 101 个开始取 205 个,这里面的数字,完全是运营给的一个随机数字,mongo的数据量还特别大。
怎么取用可难倒了我,一般的分页查询也不能用啊。
研究了一下,mongo 的分页查询,特别是大量数据的查询,简单记录如下。
一般常用的 mongo 分页,我们使用的是skip
+ limit
的方式。但是数据量特别大的时候,就显得很低效了。
传统 mongo 分页
假设一页有 10 条记录,则
plaintext
1 | // page 1 |
存在问题
官方文档对 skip
的描述:
skip
方法从结果集的开头进行扫描后返回查询结果。这样随着偏移的增加,skip
将变得更慢。
所以需要一种更快的方式,其实和mysql数据量大之后不推荐使用limit
一样的道理。
官方建议使用范围查询,可以使用索引分页,偏移量增加时通常会产生更好的性能。即指定开始位置解决方案是先查出当前页的第一条,然后顺序
取pageSize
条。
指定范围分页介绍
我们假设基于_id的条件进行查询比较。事实上,这个比较的基准字段可以是任何你想要有序的字段,比方说时间戳等等。
sql
1 | // page 1 |