引子
分页的时候我们会经常想到用skip。事实上用skip略过少量文档还是不错的,但是数据库非常多的话,skip就会比较慢(几乎每个数据库都会有这个问题,不仅仅是mongodb),所以要尽量避免。通常可以向文档本身内置查询条件来避免过大的skip,或者利用上次的结果来计算下一次查询。
不用skip对结果分页 ##
最简单的分页方法就是用limit返回结果的第一页,然后将每个后续页面作为相对于开始的偏移量返回。
然而,一般来讲可以找到一种方法实现不用skip的分页,这取决于查询本身。例如,要按照"date"降序显示文档。可以用如下方法获取结果第一页:
var page1 = db.foo.find().sort({"date":-1}).limit(100)
然后,可以利用最后一个文档中的”date”的值作为查询条件,来获取下一页:
var page2 = db.foo.find({"date":{"$gt":latest.date}});
page2.sort({"date":-1}).limit(100);
这样查询就没有skip了。
总结
回想自己以前也是一直用的skip处理的分页,没意识到这个问题。所以这里给大家提供一个思路,同时也给自己提个醒。代码能不能看懂都没关系,能看懂处理思路就行了。当然可能还有一些别的办法可以处理这个问题。