mongoDB根据某字段排序后进行分页,db.WaitAcceptOrder.find({ "locksmithId": NumberLong("1864852936723849218"), "orderType": { "$in": ["Quoted"] }, "orderQuotedCount": { "$lt": 10 }, "shouldShowAt": { "$lte": ISODate("2026-03-03T15:01:10.559Z") }, "deletedAt": null }).sort( { "distance" : 1}).skip(0).limit(10) distance值有相同值,skip(0).limit(10) skip(10).limit(10) 分页后第一页和第二页数据会重复吗?mongdb相同值的列排序是否稳定
在 MongoDB 中,排序的稳定性是不保证的。当排序字段有相同值时,MongoDB 不保证相同值的文档以固定顺序返回。
对于你的查询:
JAVASCRIPT
.sort({ "distance": 1 }).skip(0).limit(10)
.sort({ "distance": 1 }).skip(10).limit(10)
很可能出现重复数据,特别是当:
- 有很多文档的
distance值相同 - 这些相同值的文档数量超过了一页的大小
- 没有其他排序条件来确定稳定顺序
解决方案:添加第二个排序字段(最好是唯一字段):
JAVASCRIPT
.sort({ "distance": 1, "_id": 1 })
修改后的查询:
JAVASCRIPT
db.WaitAcceptOrder.find({
"locksmithId": NumberLong("1864852936723849218"),
"orderType": { "$in": ["Quoted"] },
"orderQuotedCount": { "$lt": 10 },
"shouldShowAt": { "$lte": ISODate("2026-03-03T15:01:10.559Z") },
"deletedAt": null
})
.sort({ "distance": 1, "_id": 1 }) // 添加 _id 作为第二排序字段
.skip(0).limit(10)
这样:
- 当
distance相同时,会按_id升序排列 - 保证了排序的稳定性
- 分页时不会出现重复或遗漏数据
最佳实践建议:
- 总是为排序添加一个唯一字段作为第二排序条件
- 常用的第二排序字段:
_id、创建时间戳等 - 如果业务需要严格顺序,考虑使用游标分页(基于最后一条记录的值)而不是 skip/limit