Amazon DocumentDB에서 지리 공간 데이터 쿼리
이 섹션에서는 Amazon DocumentDB를 사용하여 지리공간 데이터를 쿼리하는 방법을 다룹니다. 이 섹션을 읽고 나면 Amazon DocumentDB에서 지리공간 데이터를 저장, 쿼리 및 인덱싱하는 방법에 대한 답을 얻을 수 있을 것입니다.
개요
지리정보의 일반적인 사용 사례에는 데이터로부터의 근접성 분석이 포함됩니다. 예: “시애틀에서 50마일 이내에 있는 모든 공항 찾기” 또는 “특정 위치에서 가장 가까운 레스토랑 찾기”. Amazon DocumentDB는 GeoJSON 사양을 사용하여 지리공간
지리공간 데이터 인덱싱 및 저장
Amazon DocumentDB는 '포인트' 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
와 함께 사용되는 찾기 연산자입니다. -
$geoWithin
-$geoWithin
찾기 연산자로, 다각형과 같이 지정된 도형 내에 완전히 존재하는 지리공간 데이터가 포함된 문서를 찾는 데 사용할 수 있습니다. -
$geoIntersects
-$geoIntersects
지리공간 데이터가 지정된 GeoJSON 객체와 교차하는 문서를 찾을 수 있도록 지원하는 찾기 연산자입니다.
참고
$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 }
쿼리의 결과 수를 제한하려면 limit
또는 num
옵션을 사용합니다.
limit
:
db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "limit": 10 } } ])
num
:
db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "num": 10 } } ])
참고
$geoNear
스테이지는 반환할 최대 문서 수를 지정하는 limit
및 num
옵션을 지원합니다. $geoNear
는 limit
또는 num
옵션이 지정되지 않은 경우 기본적으로 최대 100개의 문서를 반환합니다. 이 값은 있는 경우 $limit
스테이지의 값으로 재정의되고 값이 100보다 작습니다.
예제 2
이 예제에서는 특정 주소(포인트)에서 2km 이내에 있는 모든 레스토랑(포인트)을 찾는 방법을 알아봅니다. 이러한 쿼리를 수행하려면 GeoJSON $maxDistance
포인트에서 최소 $minDistance
및 최대 $nearSphere
범위 내에서 사용할 수 있습니다.
db.usarestaurants.find({ "location":{ "$nearSphere":{ "$geometry":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "$minDistance":1, "$maxDistance":2000 } } }, { "name":1 })
위 명령은 지정된 포인트로부터 최대 2km 거리에 있는 레스토랑을 반환합니다. 이 명령의 출력은 다음과 같이 표시됩니다:
{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "name" : "Noodle House" }
제한 사항
Amazon DocumentDB는 폴리곤, 라인스트링, 멀티포인트, 멀티폴리곤, 멀티라인스트링 및 지오메트리 컬렉션의 쿼리 또는 인덱싱을 지원하지 않습니다.