关于mongodb分页查询的问题
发布于 8 年前 作者 pzHong0618 6505 次浏览 来自 问答

我们公司现在的项目用的是node+mongodb,发现服务器现在有点卡顿显现,要从业务逻辑和数据库进行两方面的优化。我们项目里用了最多的是分页查询,当然就是直接用的mongoose的两个方法limit()和skip()方法。现在要一些高级查询的优化,我也查过一些关于mongodb查询方面的资料,据说是数据量大的时候尽量不用要用这两个方法,我现在的疑惑是我查询的目标数据量比较大,但是我查询过后返回的结果集都是控制在10条每页这样传给客户端的。这样的话对查询速度是否有影响呢!像这种情况如何优化请各位给点思路。拜谢!

8 回复

node+mongodb 分页的时候在用mongoose的两个方法limit()和skip()方法,当查询数据量特别大的时候 没什么影响。

对的 skip()越到后面越慢。 算是一个经典问题了。 有人测试过google的分页,到70还是多少页后面就没有了。 所以控制一下分页数量即可。

@awong1900 刚开测试的时候 1~80没感觉到慢

@awong1900 那你的意思就说我如果控制每次返回的数据是10条的话,那这分页查询对服务器没有太大影响是吗?

当然不是,mongodb skip的原理你可以看下,跟你一次返回多少条数据影响不大,关键是你skip的页数,因为每次都是从第一页去遍历,所以你的性能消耗在skip不在limit,这个问题可以通过其他方式解决,比如要想skip 3页,给出第二页最后一条记录让其从该条记录查,要比你直接skip这种书写简单,实际笨重的操作指令好得多;

@haozxuan 我是用的mongoose操作的数据库,然后在网上查到的方法是用while+limit, 先查出第一页,然后用while判断,的到最后一条数据,然后再根据最后一条数据查询到下一页。但是这个while(item.hasNext)里面的item是用mongoose表模型查出来的报了没有这个方法的错误。还忘指点201311011610145.jpg

var p1 = db.test.find().sort({“age”:“1”}).limit(10); var latest = null; while(p1.hasNext()){ latest = p1.next(); } db.text.find({age:{$gt:latest.age}}).sort({age:1}).limit(10); 这个如果用mongodb直接操作可能还可行,但是就按照这样用mongoose操作不行的呢!@haozxuan

@pzHong0618 hasNext传送门,根据 这里,mongoose建模驱动的确没有这个函数,当然换一种思维,你只是想要得到第一页的最后一条,find默认你会得到一个doc的arr,取数组最后一条同样可以获得第一页最后一条数据;

回到顶部