【问题标题】:Lazy Loading/More Data Scroll in Mongoose/NodejsMongoose/Nodejs 中的延迟加载/更多数据滚动
【发布时间】:2014-09-01 14:01:02
【问题描述】:

我想知道如何使用猫鼬在滚动时实现延迟加载/更多数据。我想一次加载 10 个帖子,但我不确定如何最好地加载查询中的下 10 个元素。

我目前有:

var q = Post.find().sort("rating").limit(10);

加载“评分”最高的 10 个帖子。对于下一个 10 个帖子,我该如何做呢?

【问题讨论】:

  • 你不见了skip()。
  • 你能提供github链接,以便我可以在我的项目中引用和实现无限滚动。提前谢谢你。

标签: javascript node.js mongodb mongoose


【解决方案1】:

“分页”的一般概念是使用.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 是结果的最后一页还是更多取决于您要排序的值的“密度”,当然您需要将这些“保留”在会话变量或其他东西中。

但请尝试适应这一点,因为范围查询通常是您的最佳性能结果。

【讨论】:

  • $nin 运算符是否与 ID 数组一起使用?我应该使用什么数据结构来存储这些 id?
  • @DaveLee 是的,它是一个数组。答案中有指向操作员手册页的文档链接。
猜你喜欢
  • 2019-02-18
  • 1970-01-01
  • 2011-07-20
  • 2011-01-11
  • 2012-08-08
  • 1970-01-01
  • 2023-03-24
  • 2023-02-19
  • 2015-08-07
相关资源
最近更新 更多