【问题标题】:Repeating results in grouped sort on pagination with skip and limit使用跳过和限制在分页上重复导致分组排序
【发布时间】:2016-03-07 23:15:42
【问题描述】:

我有以下聚合查询来对分组数据进行排序并在页面中返回:

Product.aggregate([
  { $match : { categories : category, brand : { $ne: null } }},
  { $group : { _id : '$brand', rating: { $max: '$rating' } } },
  { $sort : { rating : -1 } },
  { $skip : skip },
  { $limit : limit }], function(error, results){
    ....
  })

这意味着找到具有输入类别和品牌的产品的品牌,将它们按品牌分组,并按品牌组中评分最高的产品对品牌组进行排序。这意味着使用跳过和限制参数进行分页。

当我对它进行分页时,我最终会得到偶尔重复的结果(只是时不时地一组,我没有注意到一个模式)。我知道数据不包括重复的产品,并且在调用之间没有任何数据发生变化,那么我在查询中做错了什么以获得这些结果?

【问题讨论】:

  • 好吧,既然你是按评级排序的,如果它在可能发生的查询之间发生变化。
  • 编辑添加数据在查询之间没有变化,感谢@joao的建议。
  • 嗯,您可以尝试将排序更改为 { $sort : { rating : -1, "_id": 1} } 看看效果如何?
  • 你说得对,有几个产品的最高评分相同,而且我似乎不能依赖排序顺序,但按_id排序也解决了这个问题!如果你想写一个答案,我会接受。

标签: mongodb mongoose aggregation-framework


【解决方案1】:

聚合中的问题与多个品牌具有相同评级的情况有关。在这种情况下,您不能保证它们会以相同的顺序出现。

解决方案是对相同的 rating 情况强制进行 brand 排序:

{ $sort : { rating : -1, "_id" : 1 } }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 2020-01-30
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2017-05-23
    相关资源
    最近更新 更多