mongodb 聚合 排序 分页 数据重复?

使用aggregate 加上 $sort $skip $limit
当$sort值相同时候 分页查询获取结果大量重复

图片描述

要是不用aggregate 用find 分页 结果没有问题···
如何解决聚合时候数据重复的问题?

阅读 5.6k
1 个回答

要这样理解,你给的排序条件是不充分的。数据库已经按照你的要求按{count: -1}完成了排序,但是因为它们的值都一样,不管谁放在前面谁放在后面其实都没有违反你的要求,因为你的要求只是count的降序而已。从数据库的角度来讲,既然你没有额外的要求,那当然是以最高效的方式给你结果,也就是不管count以外的顺序,因为这样最省资源。
那么何为最高效?这里涉及一些数据库底层的知识。在单机上,如果没有索引支持,数据库会尝试遍历所有数据,然后做一个内存排序来给你结果,从节省资源的角度,显然这个排序只排到满足了count降序为止,其他字段可以说是先到先得。这就造成在count相同时,其他顺序是随机的。它们可能受到:

  1. 自己在磁盘上的顺序影响,因为这会影响到数据库先遍历到哪条记录。并且要注意,每次更新数据时它们在磁盘上的顺序是会变化的;
  2. 理论上还和数据库使用的排序算法相关。很遗憾我也没有关注这里的排序到底使用什么算法,没法给你进一步的信息;
  3. 在分片集群环境中,结果还受到哪个片先返回数据的影响。分片环境中的排序是先在各个片排好序,再进行一次合并排序;

暂时想到这些。总之,你不指定,数据库不保证。
至于解决方案也已经很明了了,指定一个可以完全确定顺序的排序条件,比如:

{$sort: {count: -1, _id: 1}}

但是需要理解,这样会让数据库付出额外的努力来保证第二个排序条件的正确性,在实际使用场景中你要根据实际情况判断这是不是真的对你有意义。

最后说句无关的话,以后提问的时候建议尽可能用文本贴出相关的代码和结果,而不是截图。因为截图虽然方便了你自己,别人在回答问题的时候如果想用你的代码或者数据做实验那就相当麻烦。没有耐心的人可能直接忽略你的问题,对你寻找答案也不是件好事。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏