【问题标题】:Mongoose pagination with sorting猫鼬分页与排序
【发布时间】:2015-10-08 15:31:19
【问题描述】:

我无法使用 Mongoose 和 NodeJs 进行分页。在我的收藏中,我使用 id 来创建分页,如下所示:

 var limit = req.params.limit ? req.params.limit : 1;
 limit ++; 

 if(req.params.start){
     var start = mongoose.Types.ObjectId(req.params.start); 
     Canvas.find().where({_id : {$lte : start}}).sort({"_id": -1}).limit(limit).exec(function(err, items){
           if(items.length > limit -1){
               var last = items.pop(); 
               items.push({next : last._id});  
         }
       });
 }else{
     Canvas.find().sort({"_id": -1}).limit(limit).exec(function(err, items){
         if(items.length > limit -1){
              var last = items.pop(); 
              items.push({next : last._id});  
         }
     });
 }

这种方法在这种情况下非常有效。我不想使用 skip() because of performance。当我创建画布的顶级列表时,我更喜欢使用类似的实现。

每个画布都有投票,一个数字,我喜欢按降序排序。但问题是我不再可以使用 ID $lte 因为这不是他们回来的顺序,因为 ObjectId 也是kind of like a timestamp

有没有一种方法可以使用下一个变量,如上所示,作为下一页选择或任何其他实现的开始,而不使用跳过或至少使用它的性能良好?

【问题讨论】:

标签: javascript node.js mongodb pagination


【解决方案1】:

嗯,作为对代码的一点调整,您可以使用 sort({ votes: -1, _id: -1}) 并使用 votes 作为主要标准和 _id 作为次要标准进行分页。

除此之外,如果您正处于拥有太多记录的阶段,skip() 真的很痛苦,您可以通过分桶投票范围来维护单独的缓存。这将在更新边界交叉等的缓存时产生一些额外的维护,但一旦设置正确,就会非常顺利地工作。真正由您决定如何前进。不妨两者都试一试,看看哪种最适合你。

【讨论】:

  • 太棒了!我稍后会尝试,今天或明天。我在另一篇文章中读到了关于使用 skip() 的实现,并且在大约 1000 次明显的地方跳过。在我的实现中,这意味着必须有 1000 个具有相同票数的帖子(如果使用跳过),这并非不可能,但极不可能。但我喜欢有两个键的解决方案。谢谢。
  • 这就像一个魅力。首先,我仅通过降序选择,让 start 变量是可选的。第二次使用上面介绍的方法,先按票选,再按id。
猜你喜欢
  • 2020-08-25
  • 2019-09-16
  • 2012-09-20
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 2022-08-16
  • 2018-06-15
  • 2021-03-17
相关资源
最近更新 更多