我有一个简单的MongoDo聚合查询:
{
"$geoNear": {
"near": {
"type": "Point",
"coordinates": [
-73.982,
40.7685
]
},
"spherical": "true",
"distanceField": "d",
"limit": 100000,
"maxDistance": 8046.7,
"query": {
"ipv": 1
}
}
},
{
"$sort": {
"created_at": -1
}
},
{
"$limit": 5
}
我的简单问题是查询操作顺序。查询是否扫描所有文档以查找匹配的坐标,然后从该数据集匹配ipv:1,然后按created_at排序,然后限制5?
如果是这样 - 这不会发生。我有一个“限制”字段,或者它只扫描最后100条记录,匹配地理坐标,然后执行操作顺序。
有没有办法让MongoDB扫描匹配的GPS Coords的所有记录,然后执行匹配?
答案 0 :(得分:12)
以下是$ geoNear的工作原理:它将光标放到其坐标满足 maxDistance 要求的文档中。然后迭代光标,并为每个文档检查它是否与查询要求匹配。如果没有,则跳过它并移动到下一个文档。它会在找到 limit - 多个文档或光标结尾之前执行此操作。请注意,这是$ geoNear命令的 limit 参数,而不是稍后在聚合管道中指定的$ limit操作。
默认限制为100,因此如果您未指定 limit ,则会获得与查询匹配的前100个文档,其中坐标满足 maxDistance ,通过created_at对这100个文档进行排序,然后取第一个5.当您指定 limit :100000时,您将获得与查询并且其坐标满足 maxDistance ,按created_at对这100000个文档进行排序,然后取前5个。
如果您尝试将最近的5个文档送到Point,然后按created_at对这5个文档进行排序,则应将$ geoNear limit 设置为5并从中删除$ limit操作管道干脆。如果要扫描所有文档以查找匹配的坐标,按created_at对结果文档进行排序,然后获取前5个文档,则应将$ geoNear limit 设置为大于集合大小的值,你剩下的就剩下剩下的了。希望有所帮助。