MongoDB对_id做范围查询时是否会默认按_id升序返回结果?
结论
MongoDB 不会保证你给出的范围查询默认按_id排序,必须显式调用.sort({_id: 1})指定排序规则,才能确保返回结果按_id升序排列。
原因说明
- MongoDB官方有明确规则:只要查询没有显式调用
sort方法,数据库不对返回结果的顺序做任何承诺。 - 即便你的查询命中了
_id字段默认自带的唯一升序索引,也不能依赖隐含的索引顺序作为返回顺序:查询优化器的执行计划调整、分片集群下多分片返回结果的合并逻辑、存储引擎内部的页重构、并发写入操作都可能改变默认的返回顺序。 - 你当前的
_id是基于时间生成的,如果你后续要做时序数据处理、范围分页等依赖顺序的逻辑,不指定sort大概率会出现结果乱序、分页重复/遗漏数据的问题,显式加排序是唯一可靠的方案。
正确查询写法
collection.find({ "_id" : { "$lt" : NumberLong("637684488000000000"), "$gte" : NumberLong("637671528000000000") } }).sort({_id: 1})
内容的提问来源于stack exchange,提问作者Matthei
相关产品推荐
相关产品推荐

