最受欢迎的酒吧名称

WBOY
发布: 2016-06-07 16:31:15
原创
1154 人浏览过

作者: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}
]);
登录后复制

对于整个英国来说,这将返回:

  1. 红狮
  2. 皇家橡树
  3. 皇冠
  4. 白鹿
  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 出色的地理功能!

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板