获取Mongo集合主键最小最大值的最优方法:能否避免使用sort()?
如何不用sort()获取MongoDB集合自增整数主键的最小/最大值
你提到的用sort()加limit()的方法其实已经是非常高效的方案:
db.myColl.find().sort( {_id : 1 }).limit( 1 ); // 获取最小值 db.myColl.find().sort( {_id : -1 }).limit( 1 ); // 获取最大值
因为MongoDB默认会为_id字段创建索引,执行上述语句时只会走索引取首尾文档,不会做全表排序,性能开销极低。
如果一定要避免使用sort(),针对你的_id是自增整数的场景,有以下两种可行方案:
1. 聚合框架一次性获取双值
利用聚合的$min和$max操作符,可以在单次查询中同时拿到最小和最大_id,且同样会利用_id索引优化查询:
db.myColl.aggregate([ { $group: { _id: null, minId: { $min: "$_id" }, maxId: { $max: "$_id" } } } ])
返回结果会是一个包含minId和maxId的文档,示例:{ "_id" : null, "minId" : 1, "maxId" : 1000 }
2. 利用索引直接定位首尾(隐式避免sort)
可以通过指定索引hint的方式,让MongoDB直接走索引取首尾文档,写法上避免显式sort():
// 获取最小_id db.myColl.find().hint({_id: 1}).limit(1); // 获取最大_id db.myColl.find().hint({_id: -1}).limit(1);
这种写法本质和sort()方案的执行逻辑一致,都是利用索引快速定位,只是写法上没有显式调用sort()。
需要注意:如果集合存在文档删除操作,不能通过假设“起始值为1”或“当前最大插入值就是最大_id”来获取结果,必须通过查询确保准确性。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

