我有一个大约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>的
答案 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;