我想知道如何使用mongoose实现延迟加载/滚动更多数据.我想一次加载10个帖子,但我不确定如何最好地加载查询中的下10个元素.
我目前有:
var q = Post.find().sort("rating").limit(10);
加载具有最高“评级”的10个帖子.我如何为接下来的10个帖子做这个?
解决方法:
“分页”的一般概念是使用.skip(),它基本上“跳过”已经检索过的结果,因此你基本上可以这样做:
var q = Post.find().sort( "rating" ).skip(10).limit(10);
但实际上,正如你可以想象的那样,当你获得一些“页面”时,这将会大大减慢.所以你真的想要更聪明的东西.本质上,这是一个“范围查询”,您希望获得比检索到的最后一组结果更高(或更低,如果下降)的结果.所以给定最后一个值为5然后比你做的更大:
var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);
看起来没关系,但确实还有问题.如果下一个“页面”还包含评分为5的结果怎么办?此查询将跳过这些并且永远不会显示它们.
聪明的做法是“保留”文档中的所有_id值,因为它们是唯一键.基本上应用相同类型的东西,除非这次你确保你没有在新的页面中包含上一页的结果. $nin
操作符在此帮助:
var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
.sort( "rating" ).limit(10);
seeIds是否只是结果的最后一页还是更多取决于您要排序的值的“密度”,当然您需要将这些“保留”在会话变量或其他内容中.
但请尝试对此进行调整,因为范围查询通常是您最佳的性能结果.