3

我有一个简单的 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 坐标,然后执行匹配?

4

1 回答 1

13

$geoNear 的工作原理如下:它获取坐标满足maxDistance要求的文档的光标。然后它遍历游标并检查每个文档是否符合查询要求。如果没有,它会跳过它并移动到下一个文档。它会执行此操作,直到找到limit -many 文档或光标末尾。请注意,这是 $geoNear 命令的限制参数,而不是稍后在聚合管道中指定的 $limit 操作。

默认限制为 100,因此如果您未指定限制,您将获得前 100 个与查询匹配且其坐标满足maxDistance的文档,按 created_at 对这 100 个文档进行排序,然后取前 5 个。当您指定限制时:100000 ,您将获得与查询匹配且坐标满足maxDistance的前 100000 个文档,按 created_at 对这 100000 个文档进行排序,然后取前 5 个。

如果您尝试获取最接近您的点的 5 个文档,然后按 created_at 对这 5 个文档进行排序,则应将 $geoNear限制设置为 5,并从管道中完全删除 $limit 操作。如果要扫描所有文档以查找匹配坐标,按 created_at 对结果文档进行排序,然后获取前 5 个,则应将 $geoNear限制设置为大于集合大小的值,其余的保持不变它。希望有帮助。

于 2013-09-16T16:52:58.340 回答