作者:Ross Lawley,MongoEngine 维护者和 10gen 的 Scala 工程师 今年早些时候,我在 MongoDB London 上发表了关于 MongoDB 的不同聚合选项的演讲。这个话题最近在一个用户组的谈话中再次出现,
作者:Ross Lawley,MongoEngine 维护者和 10gen 的 Scala 工程师
今年早些时候,我在 MongoDB London 做了一次关于 MongoDB 的不同聚合选项的演讲。这个话题最近在一个用户组的谈话中再次出现,所以我认为它值得写一篇博文。
我想给出一个比标准的“计算文本中的单词数”更有趣的聚合演讲,随着聚合框架在 2.4 中获得了闪亮的 2dsphere 地理支持,我想我会使用它。我只是需要一个话题...
我立刻想到两件事:天气和啤酒。
我选择专注于我内心深处的事情:啤酒 :) 但是关于啤酒应该总结什么呢?然后我想起了一个最喜欢的旧酒吧测验……
英国最受欢迎的酒吧名称是什么?
我知道有一些很棒的开放数据,包括来自很棒的开放街道地图项目的大量关于酒吧的信息。我只需要了解它,很高兴 Overpass-api 为 OSM 数据提供了一个简单的“xapi”接口。我所需要的只是在英国境内标记有 amenity=pub
的任何内容,并且使用他们的 xapi 接口,这就像 wget 一样简单:
http://www.overpass-api.de/api/xapi?*[amenity=pub][bbox=-10.5,49.78,1.78,59]
一旦我有了 osm 文件,我就使用 imposm python 库来解析 xml,然后将其转换为以下 GeoJSON 格式:
{ "_id" : 451152, "amenity" : "pub", "name" : "The Dignity", "addr:housenumber" : "363", "addr:street" : "Regents Park Road", "addr:city" : "London", "addr:postcode" : "N3 1DH", "toilets" : "yes", "toilets:access" : "customers", "location" : { "type" : "Point", "coordinates" : [-0.1945732, 51.6008172] } }
然后就是简单地将其作为文档插入到 MongoDB 中。我很快注意到数据需要进行一些清理,因为我看到重复的酒吧名称,例如:“The Red Lion”和“Red Lion”。因为我想创建一个单词,所以我规范了所有酒吧名称。
如果您想了解更多有关导入过程的信息,完整的加载代码可以在 github 上找到:osm2mongo.py
事实证明,使用聚合框架找到最受欢迎的酒吧名称非常简单。只需按名称分组,然后总结所有出现的情况。为了获得前 5 个最受欢迎的酒吧名称,我们按总和值排序,然后限制为 5:
db.pubs.aggregate([ {"$group": {"_id": "$name", "value": {"$sum": 1} } }, {"$sort": {"value": -1}}, {"$limit": 5} ]);
对于整个英国来说,这将返回:
在 MongoDB London,我认为这太简单了,因此进行了筛选以找到会议附近的顶级酒吧名称,并展示了 MongoDB 2.4 中可用的一些地理功能。使用 $centreSphere
限制结果集匹配并确保位置在 2 英里半径内。只需提供坐标 [ <long>, <lat> ]</lat></long>
和大约 2 英里的半径(3959 大约是地球的半径,因此将其除以 2):
db.pubs.aggregate([ { "$match" : { "location": { "$within": { "$centerSphere": [[-0.12, 51.516], 2 / 3959] }}} }, { "$group" : { "_id" : "$name", "value" : { "$sum" : 1 } } }, { "$sort" : { "value" : -1 } }, { "$limit" : 5 } ]);
在会议上我查看了会议附近最受欢迎的酒吧名称。如果您碰巧住在伦敦市中心,那就太好了,但是英国的其他人呢?因此,在这篇博文中,我决定更新演示代码,并根据您居住的地方使其动态化。
参见:pubnames.rosslawley.co.uk
对英国以外的人表示歉意 - 演示应用程序没有全世界的数据 - 这当然是可能的。
所有代码都可以在我的 github 存储库中找到,包括 pubs 的 bson 文件和 wordle 代码 - 所以分叉它并开始使用 MongoDB 出色的地理功能!
译文地址:最受欢迎的酒吧名称,感谢原作者分享。