前一段时间我在黑客马拉松时建立了网站crowdfundstats.com。该网站根据我们已经删除的130.000左右的kickstarter项目数据给出了一些有趣的内容。最有趣的功能是http://crowdfundstats.com/map.html,您可以在其上拖动世界地图上的半径以获取有关该半径内项目的信息。
我使用聚合函数根据地理空间信息查找半径内的所有项目。每个项目都具有以下格式的地理位置:
{ g1 :
{ type : "Point" },
{ coordinates : [ -83.102840423584, 42.354639053345] }
}
汇总函数然后返回支持者的总金额,平均持续时间,成功百分比和半径内项目的总金额:
{'$match' :
{g1 :
{$geoWithin :
{ $centerSphere :[[parseFloat(long), parseFloat(lat) ], radius/6371 ]
}
}
}
},
{'$group':
{ "_id":"",
"backers": {"$sum": "$backers"},
"dateDiff2": {"$avg": "$dateDiff2"},
"completed": {"$avg": "$completed"},
"total": {"$sum": 1}
}
}
问题是查询的结果需要很长时间(例如:在英国范围内拖动半径时超过10秒)。我已经添加了一个2dsphere索引来提高速度,但这几乎没有效果:
{
"g1" : "2dsphere"
}
我可以做些什么来优化查询,或者这是地理空间查询的预期效果?
提前致谢
答案 0 :(得分:1)
对于任何在这个线程上磕磕绊绊的人来说,通过从MongoDB 3.0升级到3.2,我已经将最重的查询从15秒提高到0.5秒。他们极大地改进了地理空间查询。您可以在MongoDB blog
上阅读更多相关信息