Mongo 排序查询的坑

74 阅读1分钟

今天在处理需求的时候用到了 mongo 的分页查询的内容,但是发现第6页查询出的值居然在第7页也显示了出来,就好像查询返回了重复的值

后面一通排查发现,mongo 的 sort 排序一定要有有一个唯一的字段,否则不能保证每次 sort 出的结果的顺序都是相同的,参考 cursor.sort()

而自己排序的字段是按照创建时间来的,如果时间相同,则不保证返回的记录的顺序

解决方案:加一个排序字段(这个字段唯一就行),比如加上一个mongo的 _id 的字段,这样就能保证每次 sort 返回的结果都是相同的

另外 sort 与 limit 和 skip 连用时,sort 一定要在最前面,后面 limit 和 skip 的顺序无所谓

db.myColl.find().sort({_id: 1}).skip(3).limit(6);
db.myColl.find().sort({_id: 1}).limit(6).skip(3);

上面这种写法得出的结果是完全等价的

参考文章

数据库中对数据排序后分页,可能查询出重复数据的解决方案-CSDN博客