将地理空间路径与MongoDB进行比较

时间:2013-02-03 08:30:16

标签: mongodb geospatial bson

我正在开发一款定期跟踪用户位置的移动应用,以便让他在地图上绘制旅程的路径。我们想添加一个可选功能,告诉他应用程序的其他用户在他正在查看的时间范围内进行了类似的旅程,无论是今天的通勤还是最后一个月的旅行。我们将此称为“路径匹配”。

数据当前以二进制格式记录在iOS和Android上应用程序私有存储目录​​中的文件中,可以轻松快速地扫描到读取位置。每个文件包含一天的位置,通常运行到大约80KB。

为了能够实现路径匹配功能,我们显然需要开始将这些位置日志上传到我们的服务器(当然是用户权限),我们正在运行PHP。有人建议MongoDB具有地理空间的实力 - 但我有一些问题可能是人们可以帮助我的:

  1. 我们似乎可以将位置记录更改为使用BSON。第一个字段是设备或用户ID,后面是特定日期的位置列表。然后可以将该文件上载到我们的服务器并推送到MongoDB存储中。然而,在线文档似乎仅涉及导入由mongodump创建的BSON文件。格式是否足够稳定以至于任何应用程序都可以编写MongoDB直接读取的BSON文件?

  2. MongoDB是否能够在包含多个位置的文档或跨多个文档形成路径的位置上运行地理空间查询?或者,在PHP方面,这是否需要在数据库外部需要过多的逻辑?

1 个答案:

答案 0 :(得分:3)

  1. 格式完全稳定,但没有太多工具可以完成您所描述的内容。通常,您将它上传到后端,它会结束,比如说$_POST['locations']或者是一个关联数组数组。清理它并将其保存到数据库中,例如:

    $ locs = sanitize($ _ POST ['locations']); $ doc = array('path'=> array('type'=>'LineString','coordinates'=> $ locs),'user'=> $ userId); $收藏 - >插入($ DOC);

    在上面的例子中,我使用了一些最新的geo东西(http://docs.mongodb.org/manual/release-notes/2.4/#new-geospatial-indexes-with-geojson-and-improved-spherical-geometry),你需要每晚构建才能得到它,但它应该在大约一个月的稳定构建中。如果您在此之前需要它,则可以使用旧的地理API:http://docs.mongodb.org/manual/core/geospatial-indexes/

    MongoDB不读取BSON文件,但您可以使用mongorestore手动加载它们。我强烈建议让司机为你做低级别的事情!

  2. 您可以拥有一个包含一行(在新地理内容中)和一系列点(在旧地理内容中)的文档。我不确定“跨多个文档的路径”是什么意思。

    编辑添加:根据您的评论,您可能需要尝试{path : {$near : {$geometry : userPath}}}来查找“附近”路径。您还可以尝试在用户路径周围创建一个多边形,并在多边形内查询docs $。