지리공간적 검색
개요
지리 공간적 쿼리 연산자를 사용하여 지리적 위치를 기반으로 데이터를 쿼리할 수 있습니다. 다음 좌표계 중 하나를 사용하여 지리 공간적 쿼리의 서식을 지정할 수 있습니다.
이 섹션에는 Atlas 샘플 데이터 세트에 대해 실행할 수 있는 다양한 쿼리 연산자를 사용하는 지리 공간적 쿼리 예시가 포함되어 있습니다.
지구와 같은 구의 좌표
지구와 같은 구에서 경도 및 위도 좌표를 사용하는 지리 공간적 쿼리의 경우 GeoJSON 쿼리 형식을 사용합니다. GeoJSON에는 여러 유형이 있지만 모든 GeoJSON 데이터 유형은 다음 구조의 특정 형식을 사용합니다.
<field> : { type: <GeoJSON type>, coordinates: [ [longitude_1, latitude_1], ... [longitude_n, latitude_n] ] }
객체 유형에 따라 좌표 수가 결정됩니다. 예를 들어 Point
에는 경도와 위도라는 하나의 좌표만 필요합니다. Line
는 각 끝의 경도와 위도라는 두 개의 좌표를 사용합니다. Polygon
는 첫 번째 좌표와 마지막 좌표가 동일한 좌표 목록으로 구성되어 사실상 다각형을 닫습니다. MongoDB에서 사용할 수 있는 GeoJSON 모양에 대해 자세히 알아보려면 GeoJSON 수동 항목을 참조하세요.
GeoJSON 데이터 쿼리를 활성화하려면 필드를 2dsphere
인덱스에 추가해야 합니다. 다음 스니펫은 createIndex()
메서드를 사용하여 theaters
컬렉션의 location.geo
필드에 인덱스을 생성합니다.
db.theaters.createIndex({location.geo: "2dsphere"});
2D 평면의 좌표
2차원 유클리드 평면에서 x
및 y
좌표를 사용하여 지리 공간적 쿼리를 표현할 수도 있습니다. MongoDB까지는 이것이 지리 공간적 쿼리와 호환되는 유일한 형식이었으며 이제는 "레거시 좌표 쌍"이라고 합니다.
레거시 좌표 쌍은 다음 구조를 사용합니다.
<field> : [ x, y ]
필드는 첫 번째 값이 x
축 값을 나타내고 두 번째 값이 y
축 값을 나타내는 두 값의 배열을 포함합니다.
레거시 좌표 쌍을 사용하여 쿼리할 수 있도록 하려면 컬렉션의 필드에 2d
인덱스를 만듭니다. 다음 스니펫은 createIndex()
메서드를 사용하여 shipwrecks
컬렉션의 coordinates
필드에 인덱스을 생성합니다.
db.shipwrecks({coordinates: "2d"});
자세한 내용은 레거시 좌표 쌍에 대한 MongoDB Server 매뉴얼 페이지를 참조하세요.
참고
구형(2dsphere
) 및 평면(2d
) 인덱스는 일부 동일한 쿼리 연산자를 지원하지만, 지원하는 쿼리 연산자가 모두 동일하지는 않습니다. 전체 연산자 목록과 인덱스 호환성은 지리 공간적 쿼리 수동 항목을 참조하세요.
예시
다음 예제에서는 MongoDB Atlas 샘플 데이터 세트를 사용합니다. 무료 계층 Atlas cluster 를 설정하다 학습 방법과 샘플 데이터 세트를 로드하는 방법은 빠른 시작 가이드 에서 알아볼 수 있습니다.
이 예에서는 샘플 데이터 집합의 sample_mflix
데이터베이스에 있는 theaters
컬렉션을 사용합니다. 2} 컬렉션에 필드에 theaters
2dsphere
인덱스가 포함되어 location.geo
있습니다.
근접성 기준 쿼리
$near 연산자는 경도-위도 좌표 세트를 받아 가장 가까운 순서에서 가장 먼 순서로 문서를 반환합니다. 결과를 미터 단위의 최대 거리로 제한하려면 $maxDistance
옵션을 사용하세요. 전체 옵션 목록은 $near
에 대한 참조 문서를 확인하세요. 다음 예시는 [ -73.9667, 40.78 ]
에서 10,000
미터 이내에 있는 극장을 쿼리하는 예입니다.
// Find theaters within a certain proximity async function proximity(theaters) { // Define the query to find theaters near a specific location const query = { "location.geo": { $near: { $geometry: { type: "Point", coordinates: [-73.9667, 40.78] }, $maxDistance: 10000, }, }, }; // Find documents based on our query const cursor = theaters.find(query);
범위 내 쿼리
$geoWithin 연산자는 지정된 도형 내에 존재하는 지리 공간적 데이터가 있는 문서를 선택합니다. 다음 예시는 뉴잉글랜드 지역의 영화관을 검색하는 예시입니다.
// Find theaters within a specific geographic range async function range(theaters) { // Define the query to find theaters within a specified polygon const query = { "location.geo": { $geoWithin: { $geometry: { type: "Polygon", coordinates: [ [ [-72, 40], // Polygon coordinates defining the range [-74, 41], [-72, 39], [-72, 40], ], ], }, }, }, }; // Find documents based on our query const cursor = theaters.find(query);
쿼리에 사용할 수 있는 연산자에 대한 자세한 내용은 지리 공간적 쿼리 연산자에 대한 MongoDB Server 매뉴얼 페이지를 참조하세요.