我想知道如何使用mongoose在滚动上实现延迟加载/更多数据。我想一次加载10个帖子,但我不确定如何最好地加载查询中的下10个元素。
我目前有:
var q = Post.find().sort("rating").limit(10);
加载具有最高"等级"的10个帖子。我如何为下一个 10个帖子做这个?
答案 0 :(得分:11)
“分页”的一般概念是使用.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);
seenIds
是否只是结果的最后一页还是更多取决于您要排序的值的“密度”,当然您需要将这些“保留”在会话变量或其他内容中
但是尝试对此进行调整,因为范围查询通常是您的最佳效果。