MongoDB geoNear聚合 - 操作顺序

3

我有一个简单的MongoDB聚合查询:

{
    "$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 条吗?
如果是这样的话,实际上并不是这样的。我必须放置一个 "limit" 字段,否则它只会扫描最近的 100 条记录,匹配地理坐标,然后进行操作顺序。
有没有办法让 MongoDB 扫描所有记录以匹配 GPS 坐标,然后执行匹配操作?
1个回答

13
这里是 $geoNear 的工作原理:它获取一个游标以及满足 maxDistance 要求的文档坐标。然后遍历游标,对于每个文档检查其是否符合 query 要求。如果不符合,则跳过该文档并移动到下一个文档。直到找到 limit 个文档或游标结尾为止。请注意,这是 $geoNear 命令的 limit 参数,而不是聚合管道中后面指定的 $limit 操作。

默认的 limit 是 100,因此如果您没有指定 limit,则会获取与 query 匹配且其坐标满足 maxDistance 的前 100 个文档,并将这些文档按照创建时间排序,然后取前 5 个。当您指定 limit:100000 时,您将获取与 query 匹配且其坐标满足 maxDistance 的前 100000 个文档,并将这些文档按照创建时间排序,然后取前 5 个。

如果您想要获取距离您 Point 最近的前 5 个文档,然后按创建时间排序这 5 个文档,您应该将 $geoNear 的 limit 设置为 5,并完全删除管道中的 $limit 操作。如果您想要扫描所有文档以获取匹配的坐标,然后按创建时间排序结果文档并获取前 5 个,您应该将 $geoNear 的 limit 设置为大于集合大小的值,然后保持其他设置不变。希望这可以帮助您。


真棒!谢谢解释! - 1nstinct

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接