使用 Amazon DocumentDB 查询地理空间数据 - Amazon DocumentDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon DocumentDB 查询地理空间数据

本节介绍了如何使用 Amazon DocumentDB 查询地理空间数据。阅读本节后,您将能够回答如何在 Amazon DocumentDB 中存储、查询和索引地理空间数据。

Overview

地理空间的常见用例包括从数据中进行邻近分析。例如,“查找西雅图 50 英里范围内的所有机场”,或 “从给定地点找到最近的餐厅”。Amazon DocumentDB 使用GeoJSON 规范表示地理空间数据。GeoJSON 是用于坐标空间中形状的 JSON 格式化的开源规范。GeoJSON 坐标可捕获经度和纬度,表示类似地球的球体上的位置。

索引和存储地理空间数据

Amazon DocumentDB 使用 “Point” GeoJSON 类型来存储地理空间数据。每个 GeoJSON 文档(或子文档)通常由两个字段组成:

  • type-表示的形状,通知 Amazon DocumentDB 如何解释 “坐标” 字段。目前,Amazon DocumentDB 只支持积分

  • 坐标— 表示为数组中对象的纬度和经度对 — [经度、纬度]

Amazon DocumentDB 还使用 2dsphere 索引来索引地理空间数据。Amazon DocumentDB 支持索引点。Amazon DocumentDB 支持使用 2dsphere 索引进行邻近查询。

让我们考虑一个您正在构建食品配送服务应用程序的情况。您想在 Amazon DocumentDB 中存储各种餐厅的纬度和经度对。为此,首先我们建议您在地理空间字段上创建一个包含纬度和经度对的索引。

use restaurantsdb db.usarestaurants.createIndex({location:"2dsphere"})

此命令的输出内容类似如下所示:

{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }

创建索引后,您可以开始将数据插入 Amazon DocumentDB 集合中。

db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Thai Palace", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3264, 47.6009 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Noodle House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3517, 47.6159 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Curry House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -121.4517, 47.6229 ] } });

查询地理空间数据

Amazon DocumentDB 支持对地理空间数据的近距离查询。邻近查询的一个很好的例子是查找所有小于一定距离且距离大于另一个点的距离的点。您可以使用以下地理空间运营商从数据中获取见解 —

  • $nearSphere-$nearSphere是一个查找运算符,支持从距离 GeoJSON 点最近到最远的点查找点。

  • $geoNear-$geoNear是一种聚合运算符,支持计算距 GeoJSON 点的距离(以米为单位)。

  • $minDistance-$minDistance是与结合使用的查找运算符$nearSphere或者$geoNear到至少与中心点指定的最小距离的文件管理器文档。

  • $maxDistance-$maxDistance是与结合使用的查找运算符$nearSphere或者$geoNear到最多距离中心点指定的最大距离的文件管理器文档。

注意

$geoNear$nearSphere需要在邻近查询中使用的 GeoJSON 字段上的 2dsphere 索引。

在上面的例子中,我们插入了一些代表给定城市中餐厅的文档。现在,您可以使用地理空间运营商执行邻近查询。

示例 1

在此示例中,您将学习如何查找按距地址(点)最近的距离排序的所有餐厅(积分)。

要执行这样的查询,你可以使用$geoNear来计算一组点与另一个点的距离。您还可以添加distanceMultiplier以测量以公里为单位的距离。

db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001 } } ])

上面的命令将返回按距离指定点的距离(最接近)排序的餐厅。此命令的输出内容类似如下所示

{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "state" : "Washington", "city" : "Seattle", "name" : "Noodle House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3517, 47.6159 ] }, "DistanceKilometers" : 0.03422834547294996 } { "_id" : ObjectId("611f3da185009a81ad38e74a"), "state" : "Washington", "city" : "Seattle", "name" : "Thai Palace", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3264, 47.6009 ] }, "DistanceKilometers" : 2.5009390081704277 } { "_id" : ObjectId("611f3dae85009a81ad38e74c"), "state" : "Washington", "city" : "Seattle", "name" : "Curry House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -121.4517, 47.6229 ] }, "DistanceKilometers" : 67.52845344856914 }

示例 2

在此示例中,您将学习如何在距离特定地址(点)2 公里范围内找到所有餐厅(积分)。要执行这样的查询,你可以使用$nearSphere最小值为限$minDistance最大值$maxDistance来自 GeoJSON 点

db.usarestaurants.find({ "location":{ "$nearSphere":{ "$geometry":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "$minDistance":1, "$maxDistance":2000 } } }, { "name":1 })

以上命令将返回距指定点最多 2 公里的餐厅。此命令的输出内容类似如下所示

{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "name" : "Noodle House" }

Limitations

Amazon DocumentDB 不支持查询或索引多边形、LineString、MultiPOLYGON、MultiLineString 和 GeometryCollection。

Amazon DocumentDB 不支持包含和交叉点查询运算符,例如$geoWithin$geoIntersects.