Mongo $geoNear 查询——nscanned 数量不正确和结果不正确

4

我有一个包含大约6k篇文档的集合,其中位置字段上拥有一个2dsphere索引,例如下面:

"location" : {
    "type" : "Point",
    "coordinates" : [ 
        138.576187, 
        -35.010441
    ]
}

当使用下面的查询时,我只能得到约450个文档,nscanned大约为3k。每个文档都有一个位置,许多位置是重复的。从GeoJSON返回的距离单位是米,距离乘数为0.000625将距离转换为英里。为了测试,我期望最大距离为32180000000000,以返回地球上的所有文档,即6000。

db.x.aggregate([
{"$geoNear":{
    "near":{
        "type":"Point",
        "coordinates":[-0.3658702,51.45686]
    },
    "distanceField":"distance",
    "limit":100000,
    "distanceMultiplier":0.000625,
    "maxDistance":32180000000000,
    "spherical":true,
}}

为什么我没有返回6000个文档?我无法理解Mongo这种行为背后的逻辑。我在Mongo论坛上发现了以下信息:"geoNear命令的主要限制是,它可以返回最大文档大小的结果集,因为所有匹配的文档都会在单个结果文档中返回。"


你能找到解决这个问题的方法吗?我也处于同样的情况,需要返回距离,因此Geonear似乎是唯一的选择。 - darkgaro
1个回答

1
我相信mongodb对$GeoNear的结果有16 MB的限制。在https://github.com/mongodb/mongo/blob/master/src/mongo/db/commands/geo_near_cmd.cpp中,当geonear结果正在被构建时,有这个条件。
// Don't make a too-big result object.
if (resultBuilder.len() + resObj.objsize()> BSONObjMaxUserSize) {
    warning() << "Too many geoNear results for query " << rewritten.toString()
              << ", truncating output.";
    break;
}

https://github.com/mongodb/mongo/blob/master/src/mongo/bson/util/builder.h中,你会看到它被限制在16 MB。

const int BSONObjMaxUserSize = 16 * 1024 * 1024;

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