我正在使用 MongoDB 2.6.3 查询一个大型地理空间数据集。具体而言,我正在查询距离中心位置几公里内的所有ping,然后按用户标识符将它们合并,以获取每个用户的ping数。
自然地,我使用 MongoDB 聚合来完成这个任务,具体是使用 $geoNear 管道阶段。然而,尽管聚合在2.6.0版本中返回了一个游标,但 $geoNear 阶段仍有与聚合返回文档大小相关的结果集限制。换句话说,使用 $geoNear 的聚合仅返回65,000条记录,而等效(分页)查询则返回200,000+条记录。
有没有人能向我说明如何执行大规模的带有 geoNear 的聚合呢?
编辑: 样本文档:
以下游标查询返回约200,000个文档的计数,我认为这是正确的数字:
自然地,我使用 MongoDB 聚合来完成这个任务,具体是使用 $geoNear 管道阶段。然而,尽管聚合在2.6.0版本中返回了一个游标,但 $geoNear 阶段仍有与聚合返回文档大小相关的结果集限制。换句话说,使用 $geoNear 的聚合仅返回65,000条记录,而等效(分页)查询则返回200,000+条记录。
有没有人能向我说明如何执行大规模的带有 geoNear 的聚合呢?
编辑: 样本文档:
{
"initial_epoch_time" : 1370062800,
"location" : [
-72.3458073902,
41.8241332683
],
"_id" : ObjectId("540a34050dc2520000912286"),
"__v" : 0
}
以下游标查询返回约200,000个文档的计数,我认为这是正确的数字:
var cursor = db.pings.find( { location : { $near: { $geometry: { type: 'Point', coordinates: [-71.10560939999999, 42.3465666] }, $maxDistance: 10*1000 } } } )
var ctr = 0;
while(cursor.hasNext())
{ ctr++;
var ping = cursor.next()
}
print(ctr)
以下是基于聚合的查询:
var cursor = db.pings.aggregate ( [ {$geoNear: { near: {type: "Point", coordinates: [-71.10560939999999, 42.3465666]},limit: 100000000, spherical: true, maxDistance: 10*1000, distanceField: "distance"} } ] )
var ctr = 0;
while(cursor.hasNext())
{ ctr++;
var ping = cursor.next()
}
print(ctr)
无论最大距离是多少,都会返回约65,000个文档。
location
是使用遗留坐标对给出的,而查询和聚合使用 GeoJSON。另一个注意点是,查询使用平面查询,而聚合匹配球体。 - Markus W Mahlberg