이 챕터에서는 MongoDB가 지리적 데이터를 저장하는 방법을 소개합니다. MongoDB의 지리적 쿼리 기능을 사용하려면 먼저 지리적 데이터를 저장하는 방법을 이해해야 합니다.
지리적 데이터는 주로 점, 선, 그리고 도형으로 구성됩니다.
지도상의 한 점은 경도와 위도 좌표로 정의됩니다. 여러 점이 모여 선을 형성하고, 여러 선이 다양한 모양을 형성할 수 있습니다.
실제 응용 프로그램에서는: 가게의 위치, "내가 어디에 있나요?", "학교가 어디에 있나요?"를 모두 좌표를 이용하여 나타낼 수 있습니다. 캠퍼스나 쇼핑몰의 범위를 설명하기 위해서는 도형이 필요합니다.
GeoJSON 객체
MongoDB는 지리적 정보를 나타내기 위해 GeoJSON 객체를 사용합니다.
일반적인 GeoJSON 유형은 다음과 같습니다:
- Point - 좌표 점을 나타냄
- LineString - 선을 나타냄
- Polygon - 다각형을 나타냄
MongoDB 필드에 GeoJSON 객체를 저장하는 형식은 다음과 같습니다:
<field>: { type: <geojson type>, coordinates: <coordinates> }
설명:
-
- 필드 이름 - type - GeoJSON 유형
- coordinates - 좌표 점들의 배열. 서로 다른 GeoJSON 유형에 따라 형식이 다름
예시:
location: {
type: "Point", // 지리적 데이터의 유형, 이 경우에는 좌표 점입니다
coordinates: [-73.856077, 40.848447] // 경도, 위도
}
설명: location 필드는 좌표 점 타입의 지리적 데이터를 저장합니다.
좌표 점 (Point)
형식:
{ type: "Point", coordinates: [ 경도, 위도 ] }
예시:
{ type: "Point", coordinates: [ 40, 5 ] }
선 (LineString)
형식:
{ type: "LineString", coordinates: [ 점1, 점2, ...] }
예시:
{ type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }
다각형 (Polygon)
하나 이상의 선으로 구성될 수 있습니다. 형식:
{
type: "Polygon",
coordinates: [
선1,
선2,
....
]
}
참고: 각 선 분할의 시작점과 끝점은 닫힌 모양을 형성하기 위해 동일해야 합니다.
하나의 선 분할로 이루어진 도형
{
type: "Polygon",
coordinates: [
[ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ] // 선 분할의 좌표점, 첫 번째와 마지막 좌표는 동일함에 유의
]
}
여러 선 분할로 이루어진 도형
{
type : "Polygon",
coordinates : [
[ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ], // 선 분할 1
[ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ] // 선 분할 2
]
}
지리적 인덱스
MongoDB는 두 가지 유형의 지리적 인덱스를 지원하여 GeoJSON 데이터의 쿼리 속도를 높일 수 있습니다.
2dsphere
이는 구 형태의 지오메트리 인덱스 유형으로, 두 점 사이의 거리를 계산할 때 2dsphere는 지구를 구로 간주합니다.
2dsphere 인덱스를 생성하는 예시:
db.collection.createIndex( { location : "2dsphere" } )
location 필드에 대한 인덱스를 생성합니다.
2d
2D는 평면 지오메트리로, 두 점 사이의 거리를 평면상에 있는 것처럼 계산할 때 사용됩니다. 2D 인덱스를 생성하는 예시:
db.collection.createIndex( { location : "2d" } )
이는 location 필드에 대한 인덱스를 생성합니다.
지리적 쿼리 유형
지리적 쿼리는 모두 기하학적 계산과 관련이 있습니다. MongoDB에서 지원하는 쿼리 유형은 다음과 같습니다:
- $geoIntersects - 특정 지리적 모양의 교차점과 일치하는 문서를 찾을 때 사용됩니다.
- $geoWithin - 지정된 지리적 영역에 포함된 문서를 찾을 때 사용됩니다.
- $near - 일반적으로 지정된 좌표 점에 가장 가까운 문서를 쿼리할 때 사용됩니다.
참고: 지리적 쿼리에 대한 자세한 정보는 다음 챕터를 참조하세요.