MongoDB geoNear聚合-操作顺序

MongoDB geoNear聚合-操作顺序,mongodb,aggregation-framework,geospatial,Mongodb,Aggregation Framework,Geospatial,我有一个简单的MongoDo聚合查询: { "$geoNear": { "near": { "type": "Point", "coordinates": [ -73.982, 40.7685 ] }, "spherical": "true", "distanceField": "d",

我有一个简单的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
}
我的简单问题是关于查询操作顺序的。查询是否扫描所有文档以查找匹配的coords,然后从该数据集中匹配ipv:1,然后按created_at排序,然后限制为5

如果是这样的话,这是不会发生的。我必须设置一个“限制”字段,否则它将只扫描最后100条记录,匹配地理坐标,然后执行操作顺序


有没有办法让MongoDB扫描所有记录以查找匹配的GPS坐标,然后执行匹配?

下面是$geoNear的工作原理:它将光标指向坐标满足maxDistance要求的文档。然后它在光标上迭代,并为每个文档检查它是否符合查询要求。如果没有,它将跳过它并移动到下一个文档。它会一直这样做,直到找到限制多个文档或光标结束。请注意,这是$geoNear命令的limit参数,而不是稍后在聚合管道中指定的$limit操作

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


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

太棒了!谢谢你的解释!