MongoDB GeoNear聚合结果大小限制

3
我正在使用 MongoDB 2.6.3 查询一个大型地理空间数据集。具体而言,我正在查询距离中心位置几公里内的所有ping,然后按用户标识符将它们合并,以获取每个用户的ping数。
自然地,我使用 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个文档。


我不知道有这样的限制。你能展示一下聚合和“等价”的游标查询吗?同时提供一个样本文档会更有帮助。 - wdberkeley
@wdberkeley,请看我的修改。 - Aaron Hammond
有趣。如果在查询中指定传统的坐标对而不是GeoJSON,聚合形式的结果是否会改变?同样,将maxDistance转换为弧度是否会返回正确的结果?请注意,这里的数据是传统坐标,因此可能会返回弧度。检查投影“距离”字段中的值,并查看它是否看起来像数据和查询点之间的米数。如果不是,则是弧度,并且两个查询中的值不同。 - Neil Lunn
我注意到的一件事是,原始文件中的 location 是使用遗留坐标对给出的,而查询和聚合使用 GeoJSON。另一个注意点是,查询使用平面查询,而聚合匹配球体。 - Markus W Mahlberg
我同意Neil和Markus的观点。看起来问题在于使用传统对与geoJSON之间的单位不匹配,弧度与米之间的单位不匹配。尝试保持传统对的一致性并使用弧度,看看计数之间的差异是否仍然存在。 - wdberkeley
1个回答

3

对于其他遇到此问题的人,16MB限制已在MongoDB 4.2中修复(在本评论发布时尚未发布)。请参见MongoDB Jira上的SERVER-18965 - Turnerj

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