Mongo $ geoNear查询 - 不正确的nscanned数字和不正确的结果

时间:2015-05-10 18:54:09

标签: mongodb geospatial

我有一个大约6k个文档的集合,在位置字段上有2dsphere索引,例如:

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

使用以下查询时,我只能获得大约450个文档,其中nscan大约为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论坛上找到了: &#34; geoNear的主要限制是,作为一个命令,它可以将结果集返回到最大文档大小,因为所有匹配的文档都在单个结果文档中返回。&#34; < / em>的

1 个答案:

答案 0 :(得分: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;