문서 메뉴

문서 홈애플리케이션 개발MongoDB 드라이버Node.js 드라이버

지리공간적 검색

이 페이지의 내용

  • 개요
  • 지구와 같은 구의 좌표
  • 2D 평면의 좌표
  • 예제
  • 근접성 기준 쿼리
  • 범위 내 쿼리

지리 공간적 쿼리 연산자를 사용하여 지리적 위치를 기반으로 데이터를 쿼리할 수 있습니다. 다음 좌표계 중 하나를 사용하여 지리 공간적 쿼리의 서식을 지정할 수 있습니다.

  • 지구와 같은 구의 좌표

  • 2D 평면의 좌표

이 섹션에는 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"});

2차원 유클리드 평면에서 xy 좌표를 사용하여 지리 공간적 쿼리를 표현할 수도 있습니다. 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 매뉴얼 페이지를 참조하세요.

← 반환할 필드 지정