以下是我的限制(37)查询的查询和解释: https://gist.github.com/devinrsmith/9ea1849a3f1347c55a2f
以下是我的限制(38)查询的查询和解释: https://gist.github.com/devinrsmith/7a6f8f2cd0cb6e0c3714
限制(37)查询需要~20毫秒。 limit(38)查询需要大约150毫秒。
任何帮助解释我可能会或可能不会做错的事情都会非常有帮助!
答案 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。