MongoDB geoNear聚合 - 操作顺序

时间:2013-09-12 16:38:04

标签: mongodb aggregation-framework geospatial

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

1 个答案:

答案 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 设置为大于集合大小的值,你剩下的就剩下剩下的了。希望有所帮助。