MongoDB는 지리 공간적 데이터에 대한 쿼리 작업을 지원합니다. 이 섹션에서는 MongoDB의 지리 공간적 기능을 소개합니다.
지리 공간 데이터
MongoDB에서는 지리공간 데이터를 GeoJSON 객체 또는 레거시 좌표 쌍으로 저장할 수 있습니다.
GeoJSON 객체
지구와 같은 구에 대한 도형을 계산하려면 위치 데이터를 GeoJSON 객체로 저장하세요.
GeoJSON 데이터를 지정하려면 내장된 문서를 사용하세요.
GeoJSON 객체 유형을 지정하는
type이라는 필드 및객체의 좌표를 지정하는
coordinates라는 필드입니다.
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }
중요
위도 및 경도 좌표를 지정하는 경우 경도를 먼저 나열한 다음 위도를 나열합니다.
유효한 경도 값은
-180~180입니다(둘 모두 포함).유효한 위도 값은
-90~90입니다(둘 모두 포함).
예를 들어 GeoJSON 포인트를 지정하려면 다음을 수행합니다.
location: { type: "Point", coordinates: [-73.856077, 40.848447] }
MongoDB에서 지원되는 GeoJSON 객체 목록과 예시는 GeoJSON 객체를 참조하세요.
GeoJSON 객체에 대한 MongoDB 지리 공간적 쿼리는 구체에서 계산되며, MongoDB는 GeoJSON 객체에 대한 지리 공간적 쿼리에 WGS84 참고 시스템을 사용합니다.
레거시 좌표 쌍
2d 인덱스 인덱스 있는 평면(유클리드) 계산에는 레거시 좌표 쌍 사용합니다. 구형 계산을 수행하려면 레거시 쌍을 GeoJSON Point 로 변환하고 2dsphere 인덱스 인덱스 사용합니다.
데이터를 레거시 좌표 쌍으로 지정하려면 배열(선호되는 방법) 또는 내장된 문서를 사용할 수 있습니다.
- 배열:
<field>: [ <x>, <y> ] 경도와 위도를 사용하는 경우 경도를 먼저 나열한 다음 위도를 나열합니다.
<field>: [ <longitude>, <latitude> ] 유효한 경도 값은
-180~180입니다(둘 모두 포함).유효한 위도 값은
-90~90입니다(둘 모두 포함).
- 내장된 문서:
<field>: { <field1>: <x>, <field2>: <y> } 경도와 위도를 사용하는 경우 첫 번째 필드 경도여야 하고 두 번째 필드는 위도여야 합니다.
<field>: { <field1>: <longitude>, <field2>: <latitude> } 유효한 경도 값은
-180~180입니다(둘 모두 포함).유효한 위도 값은
-90~90입니다(둘 모두 포함).
일부 언어는 객체 필드 순서를 유지하지 않으므로 레거시 좌표 쌍 에 배열을 사용합니다.
지리 공간적 인덱스
지리 공간적 인덱스는 GeoJSON 객체 또는 레거시 좌표 쌍 으로 저장된 데이터에 대한 쿼리를 지원 . 지리 공간적 인덱스를 사용하여 지리 공간적 데이터에 대한 쿼리 성능을 향상시키거나 특정 지리 공간적 쿼리를 실행 수 있습니다.
MongoDB는 다음과 같이 두 가지 유형의 지리 공간적 인덱스를 제공합니다.
2dsphere Indexes는 구의 형상을 해석하는 쿼리를 지원합니다.
2d Indexes는 평평한 표면의 형상을 해석하는 쿼리를 지원합니다.
지리적 공간 인덱스에 대한 자세한 내용은 지리적 공간 인덱스를참조하세요.
지리공간 쿼리
참고
구형 데이터에 대한 쿼리에 2d 인덱스를 사용하면 잘못된 결과 또는 오류가 반환될 수 있습니다. 예를 들어, 2d 인덱스는 극점을 감싸는 구형 쿼리를 지원하지 않습니다.
지리공간 쿼리 연산자
MongoDB는 다음과 같은 지리 공간적 쿼리 연산자를 제공합니다. 예시를 포함한 자세한 내용은 각 참조 페이지를 참조하세요.
이름 | 설명 |
|---|---|
GeoJSON 기하 도형과 교차하는 기하 도형을 선택합니다. 2dsphere 인덱스는 | |
점 근처에 있는 지리 공간적 객체를 반환합니다. 지리 공간적 공간 인덱스가 필요합니다. | |
구의 점에 근접한 지리 공간적 객체를 반환합니다. 지리 공간적 공간 인덱스가 필요합니다. |
참고
Time Series 컬렉션은 $geoNear 집계 단계를 통해 2dsphere 인덱스에 대한 쿼리에서 지리 공간적 데이터를 정렬하는 것을 지원합니다. Time Series 컬렉션에서는 $near 및 $nearSphere 연산자를 사용할 수 없습니다.
지리 공간적 집계 단계
MongoDB에서 제공하는 다음 지리적 공간 집계 파이프라인 단계:
단계 | 설명 |
|---|---|
예시를 포함한 자세한 내용은 $geoNear 참고 페이지를 참조하세요.
지리공간 모델
MongoDB 지리공간 쿼리는 평평한 표면이나 구의 기하학적 구조를 해석할 수 있습니다.
2dsphere 인덱스는 구형 쿼리만 지원합니다(예: 구형 표면의 도형을 해석하는 쿼리).
2d 인덱스는 플랫 쿼리를 지원합니다(예 평평한 표면의 기하학을 해석하는 쿼리) 및 일부 구형 쿼리. 2d 색인은 일부 구형 쿼리를 지원하지만 이러한 구면 쿼리에 2d 색인을 사용하면 오류가 발생할 수 있습니다. 가능하면 구형 쿼리에는 2dsphere 인덱스를 사용합니다.
다음 표에는 각 지리 공간적 작업에 사용되는 지리 공간적 쿼리 연산자, 지원되는 쿼리가 나열되어 있습니다.
작업 | 구형/평면 쿼리 | 참고 사항 |
|---|---|---|
| 구형 | GeoJSON 및 2dsphere 인덱스 와 함께 사용할 때 동일한 기능을 |
평면 | ||
| 구형 | GeoJSON 포인트 과 2dsphere 인덱스 사용하는 작업과 구형 쿼리의 경우 연산자보다는 이름에 구형 쿼리를 명시적으로 지정하는 |
| 구형 | 대신 GeoJSON 점을 사용하세요. |
| 구형 | |
| 평면 | |
| 평면 | |
| 평면 | |
| 구형 | |
구형 | ||
구형 | ||
평면 |
Atlas에서 지리 공간적 쿼리 수행
예시
다음 문서를 사용하여 컬렉션 places를 생성합니다.
db.places.insertMany( [ { name: "Central Park", location: { type: "Point", coordinates: [ -73.97, 40.77 ] }, category: "Parks" }, { name: "Sara D. Roosevelt Park", location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] }, category: "Parks" }, { name: "Polo Grounds", location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] }, category: "Stadiums" } ] )
다음 작업은 location 필드에 2dsphere 인덱스를 생성합니다:
db.places.createIndex( { location: "2dsphere" } )
위의 places 컬렉션에는 2dsphere 인덱스가 있습니다. 다음 쿼리는 지정된 GeoJSON 점에서 최소 1,000미터에서 최대 5,000미터 떨어진 문서를 $near 연산자를 사용하여 가장 가까운 것부터 가장 먼 것 순으로 정렬하여 반환합니다.
db.places.find( { location: { $near: { $geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, $minDistance: 1000, $maxDistance: 5000 } } } )
다음 작업은 $geoNear 집계 연산을 사용하여 쿼리 필터 { category:
"Parks" }과 일치하는 문서를 지정된 GeoJSON 점에서 가장 가까운 순서에서 가장 먼 순서로 정렬하여 반환합니다:
db.places.aggregate( [ { $geoNear: { near: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, spherical: true, query: { category: "Parks" }, distanceField: "calcDistance" } } ] )