数量级限制(37)与限制(38)nearSphere

时间:2015-10-09 20:00:07

标签: mongodb

以下是我的限制(37)查询的查询和解释: https://gist.github.com/devinrsmith/9ea1849a3f1347c55a2f

以下是我的限制(38)查询的查询和解释: https://gist.github.com/devinrsmith/7a6f8f2cd0cb6e0c3714

限制(37)查询需要~20毫秒。 limit(38)查询需要大约150毫秒。

任何帮助解释我可能会或可能不会做错的事情都会非常有帮助!

1 个答案:

答案 0 :(得分:2)

当您请求按距离顺序排序的结果(从最近到最远)时,MongoDB地理空间运算符的工作原理是预期的行为。为避免对整个集合进行排序,$geoNear$nearSphere运算符以距离间隔迭代扩展搜索区域。

限制为37,您的匹配结果恰好在单个inputStage中找到(如解释输出中所示)。限制为38需要扩展搜索区域,因此您会注意到第一个inputStage与限制(37)解释相同,第二个inputStage具有额外的比较。

根据数据集的密度,与MongoDB 3.0中返回的文档数量相比,扫描的索引键数量可能不成比例。

比较一些限制(37)执行统计数据:

"executionStats" : {
    "nReturned" : 37,
    "executionTimeMillis" : 24,
    "totalKeysExamined" : 560,
    "totalDocsExamined" : 299,
}

有限制(38)执行统计数据:

"executionStats" : {
    "nReturned" : 38,
    "executionTimeMillis" : 148,
    "totalKeysExamined" : 1629,
    "totalDocsExamined" : 1084,
}

...限制(38)的总执行时间更长,因为扩展的搜索区域需要大约三倍的密钥和数量。文件比较。

有关算法如何工作的更多信息(以及MongoDB 3.2中的一些重大改进),请参阅:Geospatial Performance Improvements in MongoDB 3.2