문서 홈 → 애플리케이션 개발 → MongoDB 드라이버 → Node.js 드라이버
지리공간적 검색
개요
지리 공간적 쿼리 연산자를 사용하여 지리적 위치를 기반으로 데이터를 쿼리할 수 있습니다. 다음 좌표계 중 하나를 사용하여 지리 공간적 쿼리의 서식을 지정할 수 있습니다.
이 섹션에는 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 클러스터를 설정하는 방법과 샘플 데이터 세트를 로드하는 방법을 알아볼 수 있습니다.
이 예에서는 샘플 데이터 집합의 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 매뉴얼 페이지를 참조하세요.